Jpa多对多联合动态查询咨询

zgw06629 发布于 2015/10/30 20:42
阅读 2K+
收藏 0
如采购方(Buyer)与供应商(Supplier)是多对多的关系, 会有一个中间表(buyer_id,supplier_id,other columns)

这时我在页面上搜索属于某一个供应商的采购方,该如何做呢?

我目前是先将所属该供应商的采购方ID全部查询出来, 再将其作为搜索采购方(Buyer)的一个查询条件
此时对应的sql相当于

select buyer_id from buer_supplier where supplier_id = ?;


select b.* from buyer b
where b.id in (...)
and b.name like '%XXX%'
and b.phone like '%YYY%'

当前动态查询是利用了Jpa的JpaSpecificationExecutor,并参考了一个开源实现,见

https://github.com/springside/springside4/blob/master/modules/core/src/main/java/org/springside/modules/persistence/DynamicSpecifications.java

想直接通过一个关联查询来完成此功能, 即

select b.* from buyer b,buyer_supplier bs
where b.id = bs.buyer_id
and bs.supplier_id = ?
and b.name like '%XXX%'
and b.phone like '%YYY%'

这时该如何处理呢? 需要修改DynamicSpecifications吗?


加载中
0
m
msgcui
Entity中使用@ManyToMany注解
0
大王来巡山
大王来巡山

springside4 在动态查询方面,个人觉得是做了一个很错误的示范.

请自己实现动态查询

大王来巡山
大王来巡山
回复 @zgw06629 : 这个是我自己写的
zgw06629
zgw06629
回复 @大王来巡山 : 请问下@Log逻辑是在哪而处理的呢? 拦截器吗?没见着有这个类啊
大王来巡山
大王来巡山
回复 @zgw06629 : 我的东西不一定适合你.但是你可以作为参考 https://git.oschina.net/tanx/myAdmin.git
zgw06629
zgw06629
谢谢! 我也是最近的一个项目才接触Spring data jpa,不知道能否提供一些关于Jpa联合动态查询的文档和代码示例的链接
0
大王来巡山
大王来巡山
并且 springside4  只解决了 最最最基本的查询
0
zgw06629
zgw06629
回复 @大王来巡山 : 看了一下你的代码,觉得灵活性不如Springside4, 很多地方还是写死了。尤其是我想达到这样的效果
GET /cars?color=red Returns a list of red cars
GET /cars?seats<=2 Returns a list of cars with a maximum of 2 seats
GET /cars?sort=-manufactorer,+model
GET /cars?fields=manufacturer,model,id,color

http://blog.mwaysolutions.com/2014/06/05/10-best-practices-for-better-restful-api/

因为后端只提供数据存取的Rest Api给前端,由前端去完成页面展示逻辑。
基本上单表查询的话,springside能满足上述要求了。
0
大王来巡山
大王来巡山

引用来自“zgw06629”的评论

回复 @大王来巡山 : 看了一下你的代码,觉得灵活性不如Springside4, 很多地方还是写死了。尤其是我想达到这样的效果
GET /cars?color=red Returns a list of red cars
GET /cars?seats<=2 Returns a list of cars with a maximum of 2 seats
GET /cars?sort=-manufactorer,+model
GET /cars?fields=manufacturer,model,id,color

http://blog.mwaysolutions.com/2014/06/05/10-best-practices-for-better-restful-api/

因为后端只提供数据存取的Rest Api给前端,由前端去完成页面展示逻辑。
基本上单表查询的话,springside能满足上述要求了。
您随意.
0
大王来巡山
大王来巡山

引用来自“zgw06629”的评论

回复 @大王来巡山 : 看了一下你的代码,觉得灵活性不如Springside4, 很多地方还是写死了。尤其是我想达到这样的效果
GET /cars?color=red Returns a list of red cars
GET /cars?seats<=2 Returns a list of cars with a maximum of 2 seats
GET /cars?sort=-manufactorer,+model
GET /cars?fields=manufacturer,model,id,color

http://blog.mwaysolutions.com/2014/06/05/10-best-practices-for-better-restful-api/

因为后端只提供数据存取的Rest Api给前端,由前端去完成页面展示逻辑。
基本上单表查询的话,springside能满足上述要求了。

主要是真正做到项目了,存在很多限制.

比如:  我前面一个输入框 输入的是关键字,然后后台是要查询几个字段的值是否包含这个关键字(就是百度的关键字搜索) 这个怎么处理呢? 难道要通过其他方式来解决?

什么方式最合理呢?

大王来巡山
大王来巡山
回复 @zgw06629 : 基于以上东西,我觉得你应该考虑一下,springside4的这种方式是否合理了
zgw06629
zgw06629
对 实际的情况是 不只是从数据库取数据 有可能从Elastic中进行搜索,同时搜索商品名称,商品品牌,别名等, 以及从redis中取数据。所以我也在想如何能够实现上述接口设计目标
0
雨落风
雨落风
spring data JPA 在动态查询方面还是没有Hibernate 原来的Legacy Hibernate Criteria Queries方便,但是为了遵从JAP2.0标准,Hibernate Criteria Queries建议废弃了。


可以看看https://github.com/wenhao/jpa-spec这个动态查询库。简化了动态查询过程。举个例子:
public List<Phone> findAll(SearchRequest request) {
    Specification<Person> specification = new Specifications<Person>()
        .between("age", new Range<>(10, 35))
        .and(StringUtils.isNotBlank(jack.getName()), ((root, query, cb) -> {
            Join address = root.join("addresses", JoinType.LEFT);
            return cb.equal(address.get("street"), "Chengdu");
        }))
        .build();

    return phoneRepository.findAll(specification);
}




返回顶部
顶部