Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jpa标准API,具有@OneTomany关系的动态谓词_Java_Hibernate_Jpa_Criteria Api - Fatal编程技术网

Java Jpa标准API,具有@OneTomany关系的动态谓词

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

这里是我的实体

TradeItem.class 达伊姆普
@存储库
公共类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()))
            );

        }