Spring Data JPA 2:マルチテーブル関連ページングクエリーの実装

2163 ワード

最近、JPAの使用中に単一テーブルの操作が便利であることが分かったが、複数テーブルを組み合わせて調べるように設計されると、いくつかの特殊な操作が必要になる.
プロジェクトの1つのシーンはバックグラウンドで1ページのリストクエリーをする必要があり、必要なデータは2つのテーブルに分散し、mybatisであればresultMapを直接定義し、SQLを手書きで書くことができます.JPAではJPQLが必要です.
まず、各オブジェクト間の関係を定義します.
エンティティGxOrderDO:受注.
エンティティGxOrderDetailDO:受注詳細.
エンティティGxOrderInfoRsp:分割されたページングはオブジェクトを返します.
GxOrderDOとGxOrderDetailDOはorderIdフィールドで2つのテーブルの関連付けを行います.
返される結果セットをカプセル化するオブジェクトを作成します.
GxOrderInfoRsp.java:
public class GxOrderInfoRsp implements Serializable{
    /**
     *   ID
     */
    private String orderId;
    /**
     *     
     */
    private Integer orderStatus;
    /**
     *     
     */
    private Integer orderType;
    /**
     *       
     */
    private BigDecimal orderAmount;
    /**
     *     (  )   
     */
    private Integer orderChannel;

    public GxOrderInfoRsp(String orderId, Integer orderStatus, Integer orderType,         
                          BigDecimal orderAmount, Integer orderChannel) {
        this.orderId = orderId;
        this.orderStatus = orderStatus;
        this.orderType = orderType;
        this.orderAmount = orderAmount;
        this.orderChannel = orderChannel;
        
    }

Repository:
@Query("SELECT new com.app.domain.GxOrderInfoRsp(r.orderId, r.orderStatus, r.orderType, rd.orderAmount, rd.orderChannel)" +
        " FROM GxOrderDO r, GxOrderDetailDO rd WHERE r.orderId = rd.orderId and ( r.orderId=:#{#customer.orderId} or :#{#customer.orderId} is null)   ")
Page  findOrderPage(@Param("customer") GxOrderDO customer,Pageable pageable);

注意:@Queryのnewのオブジェクトのパラメータの順序は、構築方法のパラメータの順序と一致します.
r.orderId=:#{#customer.orderId}or:#{#customer.orderId}is null)これは非空判断であり、空であればこの条件をスキップし、実行しない.ここではSpring Data JPA@Query定義におけるSpEL特性を用いた
Service:
Pageable pageable = new PageRequest(0,3, Sort.Direction.DESC,"createTime");

 
記事の参考:
https://spring.io/blog/2014/07/15/spel-support-in-spring-data-jpa-query-definitions
https://blog.csdn.net/moshowgame/article/details/80672617