spring data jpa多表多条件クエリ
7886 ワード
今は次のようなシーンがあります.A表のチェックバックによって.codeフィールドとBテーブルのstore_code、check_このフィールドは、AテーブルとBテーブルとの関連付けがペア以上であることを確認します.クエリパラメータを簡単にするために、クエリパラメータをカプセル化し、共通のQueryCoditionを抽出しました.
public class QueryCondition {
protected int page = 1;
protected int limit = 10;
public QueryCondition() {
};
public QueryCondition(int page, int limit) {
this.page = page;
this.limit = limit;
}
public Specification getWhereClause() {
return new Specification() {
@Override
public Predicate toPredicate(Root root, CriteriaQuery> query, CriteriaBuilder cb) {
List list = new ArrayList();
list.add(cb.equal(root.get("status"), Status.STATUS_ACTIVE));
return cb.and(list.toArray(new Predicate[list.size()]));
}
};
}
public Pageable getPageRequest() {
if (page < 1) {
page = 1;
}
return new PageRequest(page - 1, limit);
}
public Criteria buildPageableCriteria(Criteria c) {
int start = (this.getPage() - 1) * this.getLimit();
c.setFirstResult(start);
c.setMaxResults(this.getLimit());
return c;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getLimit() {
return limit;
}
public void setLimit(int limit) {
this.limit = limit;
}
}
公共Query Condationの基礎の上で、私達は個性的なAQueryCondationをカプセル化しました.public class AQueryCondition extends QueryCondition{
prvate String checkCode;
prvate String storoCode;
public String toListKey(){
String key=toCountKey()+“.”+page+“.”+limit;
try{
return DigestUtils.md 5 DigestAsHex(key.getBytes(「UTF-8」);
}catch(Unisupported EnccodingException e){
)
return key;
)
public String toCountKey()
String key=checkCode.hashCode()+「.」+store Code.hashCode()
try{
return DigestUtils.md 5 DigestAsHex(key.getBytes(「UTF-8」);
}catch(Unisupported EnccodingException e){
)
return key;
)
public SpecificationgetWhereClause(){
return new Specification(){
@オーバーライド
public Predicate toPredicate(Root)root,CriteriaQuery>query,CriteriaBuider cb){
JoinabMap=root.join(「bs」、
ジョインType.LEFT)
List list=new ArayList()
if(StringUtils.isNotBlank){
list.add(cb.equal(root.get).as(String.class)、checkCode);
)
if(StringUtils.isNotBlank){
list.add(cb.equal(abMap.get).as(String.class)、storore Code)
list.add(cb.equal(abMap.get).as(String.class),[OK]
)
query.groupBy(root.get).orderBy(cb.desc(root.get);
return cb.and(list.toAray(new Predicate[list.size]);
)
}
)
public String get CheckCode()
return check Code;
)
public void set CheckCode(String checkCode){
this.checkCode=checkCode;
)
public String get StreCode(){
return store Code;
)
public void set StororeCode(String storecode){
this.store Code=store Code;
)
)
AQueryCoditionではAとBの左接続関連クエリを使っていますので、AでBとの関係を定義する必要があります.@OneToMany
@JoinColumn(name = "pkg", referencedColumnName = "pkg", insertable = false, updatable = false)
private Collection bs = new ArrayList();
これで基礎の仕事ができました.その後、どうやってController、Service、Dao階で呼び出されますか?Controller層はAQueryCondationで照会パラメータを受信します. @RequestMapping("/list.do")
public @ResponseBody PageInfo list(AQueryCondition cond) {
Pagepage=aService.pageFind(cond)
…
long total=appSpident Service.com unt;
return new PageInfo(relt,total,cond.getPage(),cond.get Limit();
)
Service層とDao層にキャッシュを追加しました.このステップはオプションです.ここはService層のキャッシュ層です.@Autowired
private CachedARepository aRepository;
public PagepageFind(AQuery Condation cond){
return aRepository.pageFind(cond);
)
キャッシュ層はAQueryCondationの方法でグループクエリを行います.public PagepageFind(final AQuery Condation cond){
return cache.get(key.get ListKey(cond.toListKey),new CacheGetCallback){
@オーバーライド
public PagegetObject()throws Exception{
return aRepository.findAll(cond.getWhere Clause()、cond.get Pagerequest();
)
@オーバーライド
public String[]getCachoups(Page)o){
return new String[]{key.get GrapKey("list")};
)
}
)
public long count(AQueryCondation cond){
return aRepository.findAll(cond.getWhere Clause).size()
)
Dao層は、公共方法の継承と個性化方法の作成を行います.@Transactional
public interface ARepository extends JpaRepository<A, Long>, JpaSpecificationExecutor<A> {
}
ここで、spring data jpa多表多条件検索の実現手順について説明しましたが、どうやって実現しますか?