Spring Data JPA 2:マルチテーブル関連ページングクエリーの実装
2163 ワード
最近、JPAの使用中に単一テーブルの操作が便利であることが分かったが、複数テーブルを組み合わせて調べるように設計されると、いくつかの特殊な操作が必要になる.
プロジェクトの1つのシーンはバックグラウンドで1ページのリストクエリーをする必要があり、必要なデータは2つのテーブルに分散し、mybatisであればresultMapを直接定義し、SQLを手書きで書くことができます.JPAではJPQLが必要です.
まず、各オブジェクト間の関係を定義します.
エンティティGxOrderDO:受注.
エンティティGxOrderDetailDO:受注詳細.
エンティティGxOrderInfoRsp:分割されたページングはオブジェクトを返します.
GxOrderDOとGxOrderDetailDOはorderIdフィールドで2つのテーブルの関連付けを行います.
返される結果セットをカプセル化するオブジェクトを作成します.
GxOrderInfoRsp.java:
Repository:
注意:@Queryのnewのオブジェクトのパラメータの順序は、構築方法のパラメータの順序と一致します.
r.orderId=:#{#customer.orderId}or:#{#customer.orderId}is null)これは非空判断であり、空であればこの条件をスキップし、実行しない.ここではSpring Data JPA@Query定義におけるSpEL特性を用いた
Service:
記事の参考:
https://spring.io/blog/2014/07/15/spel-support-in-spring-data-jpa-query-definitions
https://blog.csdn.net/moshowgame/article/details/80672617
プロジェクトの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