简体   繁体   English

Spring JPA查询以获取具有计数条件的数据

[英]Spring JPA Query to get Data with Count Condition

I have an Order Entity that has many Review Entities. 我有一个具有许多审阅实体的订单实体。 Order has many OrderItem entities that's also has many Review Entities. 订单具有许多OrderItem实体,也具有许多审阅实体。 So User can enter reviews for specific Order as common review or specific Order Item as item review. 因此,用户可以将特定订单的评论输入为普通评论,也可以将特定订单商品输入为商品评论。

Now I want to List the Orders with reviews available and Order with No reviews. 现在,我要列出具有可用评论的订单和没有评论的订单。 For this I have to check Order || 为此,我必须检查订单|| OrderItem has reviews in Reviews Table simultaneously. OrderItem在评论表中同时具有评论。 I think count query with Join clause to be performed. 我认为要执行带有Join子句的计数查询。 Please solve this problem. 请解决这个问题。

OrderDO.java OrderDO.java

@Table(name = "ORDER")
public class OrderDO  implements Serializable{

    @Column(name = "ORDER_NUMBER", nullable = false)
    private String orderNumber; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy="order")
    private Set<ReviewDO> reviews = new HashSet<>();
}

OrderItemDO.java OrderItemDO.java

@Table(name = "ORDER_ITEM")
public class OrderItemDO implements Serializable{   

    @Column(name = "PRODUCT_NAME",nullable = false)
    private String name;

    @OneToMany(cascade = CascadeType.ALL, mappedBy="item")
    private Set<ReviewDO> reviews = new HashSet<>();
}

ReviewDO.java ReviewDO.java

@Table(name = "REVIEW")
public class ReviewDO implements Serializable {

    @Column(name = "RATING")
    private double rating;

    @Column(name = "REVIEW_TEXT")
    private String reviewText;

    @ManyToOne()
    @JoinColumn(name = "ITEM_ID", referencedColumnName="ID")
    private OrderItemDO item;

    @ManyToOne()
    @JoinColumn(name = "ORDER_ID", referencedColumnName="ID")
    private OrderDO order;
   }

OrderRepository.java OrderRepository.java

@Repository
public interface OrderRepository extends CrudRepository<OrderDO, Long>{

    @Query("select order from OrderDO order where order.orderNumber = ?1")
    public Optional<OrderDO> findByOrderNumber(String orderNumber);

}

To find those reviews that are associated with orders or order-items, you can query on ReviewDO object by placing a ReviewRepository as is shown below:- 要查找与订单或订单项关联的评论,可以通过放置一个ReviewRepository来对ReviewDO对象进行查询,如下所示:

@Repository
public interface ReviewRepository extends CrudRepository<ReviewDO, Long>{

    @Query(value = "SELECT r FROM ReviewDO r where r.item is not null or r.order is not null")
    List<ReviewDO> findAllByOrdersOrOrderItems();

}

Please check the test case given below matching to your requirements or not 请检查下面给出的测试用例是否符合您的要求

import static org.junit.Assert.assertEquals; 导入静态org.junit.Assert.assertEquals;

import java.util.List;
import java.util.stream.Collectors;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import com.raj.so.artefacts.OrderDO;
import com.raj.so.artefacts.OrderItemDO;
import com.raj.so.artefacts.OrderItemRepository;
import com.raj.so.artefacts.OrderRepository;
import com.raj.so.artefacts.ReviewDO;
import com.raj.so.artefacts.ReviewRepository;

@DataJpaTest
@RunWith(SpringRunner.class)
public class ReviewRepositoryTest {

    @Autowired
    private OrderRepository orderRepository;

    @Autowired
    private OrderItemRepository orderItemRepository;

    @Autowired
    private ReviewRepository reviewRepository;

    @Test
    public void testRepositoryFetch() {

        // creating 2 orders
        OrderDO orderDO1 = new OrderDO();
        orderDO1.setOrderNumber("1");
        orderRepository.save(orderDO1);
        OrderDO orderDO2 = new OrderDO();
        orderDO2.setOrderNumber("2");
        orderRepository.save(orderDO2);

        // creating an order item
        OrderItemDO orderItemDO1 = new OrderItemDO();
        orderItemDO1.setName("order item 1");
        orderItemRepository.save(orderItemDO1);

        // creating 2 reviews - one for order; other for item
        ReviewDO reviewDO1 = new ReviewDO();
        reviewDO1.setRating(5.0);
        reviewDO1.setReviewText("rate five");
        reviewDO1.setOrder(orderDO1);
        reviewRepository.save(reviewDO1);

        ReviewDO reviewDO2 = new ReviewDO();
        reviewDO2.setRating(4.0);
        reviewDO2.setReviewText("rate four");
        reviewDO2.setItem(orderItemDO1);
        reviewRepository.save(reviewDO2);

        // query all reviews associated to orders or items
        // returned review objects will have details about orders and items
        List<ReviewDO> reviews = reviewRepository.findAllByOrdersOrOrderItems();

        assertEquals(2, reviews.size());

        List<String> orderNumbers = reviews.stream().map(item -> {
            if (item.getOrder() != null) {
                return item.getOrder().getOrderNumber();
            } else {
                return null;
            }
        })
        .filter(item -> item != null)
        .collect(Collectors.toList());

        assertEquals("1", orderNumbers.get(0));

        List<String> orderItemNames = reviews.stream().map(item -> {
            if (item.getItem() != null) {
                return item.getItem().getName();
            } else {
                return null;
            }
        })
        .filter(item -> item != null)
        .collect(Collectors.toList());

        assertEquals("order item 1", orderItemNames.get(0));
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM