spring data jpa多表多条件クエリ


今は次のようなシーンがあります.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多表多条件検索の実現手順について説明しましたが、どうやって実現しますか?