Java Jpa标准API,具有@OneTomany关系的动态谓词
这里是我的实体 TradeItem.class 达伊姆普Java Jpa标准API,具有@OneTomany关系的动态谓词,java,hibernate,jpa,criteria-api,Java,Hibernate,Jpa,Criteria Api,这里是我的实体 TradeItem.class 达伊姆普 @存储库 公共类TradeItemDaoImp实现TradeItemDao{ @持久上下文 私人实体管理者; @凌驾 公共可选搜索(TradeItemRequest){ CriteriaBuilder CriteriaBuilder=em.getCriteriaBuilder(); CriteriaQuery cq=criteriaBuilder.createQuery(TradeItem.class); Root=cq.from(Tra
@存储库
公共类TradeItemDaoImp实现TradeItemDao{
@持久上下文
私人实体管理者;
@凌驾
公共可选搜索(TradeItemRequest){
CriteriaBuilder CriteriaBuilder=em.getCriteriaBuilder();
CriteriaQuery cq=criteriaBuilder.createQuery(TradeItem.class);
Root=cq.from(TradeItem.class);
列表谓词=新的LinkedList();
add(criteriaBuilder.equal(root.get(“league”)、request.getLeague());
if(request.getName()!=null){
add(criteriaBuilder.like(root.get(“name”),“%”+request.getName()+“%”);
}
if(request.getType()!=null){
add(criteriaBuilder.equal(root.get(“type”)、request.getType());
}
if(request.getBase()!=null){
add(criteriaBuilder.equal(root.get(“base”)、request.getBase());
}
if(request.getIdentified()!=null){
add(criteriaBuilder.equal(root.get(“identified”)、request.getIdentified());
}
if(request.getcorrude()!=null){
add(criteriaBuilder.equal(root.get(“损坏”),request.getcorrude());
}
if(request.getMods().size()>0){
Join mod=root.joinSet(“mod”);
for(ModRequest m:request.getMods()){
谓词.add(
标准构建器(
criteriaBuilder.equal(mod.get(“modName”)、m.getName(),
criteriaBuilder.ge(mod.get(“miniValue”),m.getMinValue()==null?0:m.getMinValue()),
criteriaBuilder.le(mod.get(“maxiValue”),m.getMaxValue()==null?10000:m.getMaxValue())
);
}
}
选择(根)
.where(predicates.toArray(新谓词[predicates.size()]);
TypedQuery TypedQuery=em.createQuery(cq);
返回可选的.of(
类型查询
.setFirstResult(0)
.setMaxResults(50)
.getResultList());
}
}
基本上,我想做的是,我已经为一个特定的贸易论坛开发了一个Webscraper。我有一个网络应用程序,你可以通过表单搜索论坛项目。现在,每个TradingItem都包含一组mod(@OneToMany),它们具有不同的名称和值
当我搜索一个只有一个或零个mod的项目时,它工作得很好。但只要我在搜索表单中添加两个或更多mod,它就会返回一个空列表
我不熟悉CriteriaAPI,我的mod谓词/逻辑显然有问题
我正在使用Hibernate5.1.0和MySql
编辑:已解决
我只需将连接移动到for循环内部
for (ModRequest m : request.getMods()) {
Join<TradeItem, Mod> mod = root.joinSet("mod");
predicates.add(
criteriaBuilder.and(
criteriaBuilder.equal(mod.get("modName"), m.getName()),
criteriaBuilder.ge(mod.get("miniValue"), m.getMinValue() == null ? 0 : m.getMinValue()),
criteriaBuilder.le(mod.get("maxiValue"), m.getMaxValue() == null ? 10000 : m.getMaxValue()))
);
}
for(ModRequest m:request.getMods()){
Join mod=root.joinSet(“mod”);
谓词.add(
标准构建器(
criteriaBuilder.equal(mod.get(“modName”)、m.getName(),
criteriaBuilder.ge(mod.get(“miniValue”),m.getMinValue()==null?0:m.getMinValue()),
criteriaBuilder.le(mod.get(“maxiValue”),m.getMaxValue()==null?10000:m.getMaxValue())
);
}
打开SQL日志记录,生成的SQL可能会提示您出了什么问题。不要在问题正文中添加答案。相反,为您自己的问题创建一个答案打开SQL日志记录,生成的SQL可能会提示您出了什么问题。不要在问题正文中添加答案。相反,为你自己的问题创建一个答案
@Entity
@Table(name = "MODS")
public class Mod {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private Double miniValue;
private Double maxiValue;
private String modName;
...
}
@Repository
public class TradeItemDaoImp implements TradeItemDao{
@PersistenceContext
private EntityManager em;
@Override
public Optional<List<TradeItem>> search(TradeItemRequest request) {
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<TradeItem> cq = criteriaBuilder.createQuery(TradeItem.class);
Root<TradeItem> root = cq.from(TradeItem.class);
List<Predicate> predicates = new LinkedList<>();
predicates.add(criteriaBuilder.equal(root.get("league"), request.getLeague()));
if(request.getName() != null){
predicates.add(criteriaBuilder.like(root.get("name"), "%"+request.getName()+"%"));
}
if(request.getType() != null){
predicates.add(criteriaBuilder.equal(root.get("type"), request.getType()));
}
if(request.getBase() != null) {
predicates.add(criteriaBuilder.equal(root.get("base"), request.getBase()));
}
if(request.getIdentified() != null){
predicates.add(criteriaBuilder.equal(root.get("identified"), request.getIdentified()));
}
if(request.getCorrupted() != null){
predicates.add(criteriaBuilder.equal(root.get("corrupted"), request.getCorrupted()));
}
if(request.getMods().size() > 0) {
Join<TradeItem, Mod> mod = root.joinSet("mod");
for (ModRequest m : request.getMods()) {
predicates.add(
criteriaBuilder.and(
criteriaBuilder.equal(mod.get("modName"), m.getName()),
criteriaBuilder.ge(mod.get("miniValue"), m.getMinValue() == null ? 0 : m.getMinValue()),
criteriaBuilder.le(mod.get("maxiValue"), m.getMaxValue() == null ? 10000 : m.getMaxValue()))
);
}
}
cq.select(root)
.where(predicates.toArray(new Predicate[predicates.size()]));
TypedQuery<TradeItem> typedQuery = em.createQuery(cq);
return Optional.of(
typedQuery
.setFirstResult(0)
.setMaxResults(50)
.getResultList());
}
}
for (ModRequest m : request.getMods()) {
Join<TradeItem, Mod> mod = root.joinSet("mod");
predicates.add(
criteriaBuilder.and(
criteriaBuilder.equal(mod.get("modName"), m.getName()),
criteriaBuilder.ge(mod.get("miniValue"), m.getMinValue() == null ? 0 : m.getMinValue()),
criteriaBuilder.le(mod.get("maxiValue"), m.getMaxValue() == null ? 10000 : m.getMaxValue()))
);
}