Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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 JPQL检入参数不为null,然后执行查询_Java_Jpa_Jpql - Fatal编程技术网

Java JPQL检入参数不为null,然后执行查询

Java JPQL检入参数不为null,然后执行查询,java,jpa,jpql,Java,Jpa,Jpql,我有一些参数可以为null,也可以不为null 我要做的是只使用不为null的参数执行查询 例如,我有: String param1; String param2; 我想这样做: If ( param1 != null && param2 != null ) { Query q = em.createQuery("SELECT a FROM Advert where a.property = param1 and a.property2= param2); }

我有一些参数可以为null,也可以不为null

我要做的是只使用不为null的参数执行查询

例如,我有:

String param1;
String param2;
我想这样做:

 If ( param1 != null && param2 != null ) {
    Query q = em.createQuery("SELECT a FROM Advert where a.property = param1 and a.property2= param2);
 }

 if( param1 == null && param2 != null ) {
    Query q = em.createQuery("SELECT a FROM Advert where  a.property2= param2")
 }

 if( param1 != null && param2 == null ) {
    Query q = em.createQuery("SELECT a FROM Advert where  a.property= param1");
 }
不使用if语句是否可以做到这一点 但是使用jpql查询字符串?
(因为我有两个以上的参数,而且检查这么多案例并不方便)

您可以有如下内容:

        CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
        CriteriaQuery<Advert> query = criteriaBuilder.createQuery(Advert.class);
        Root<Advert> advertRoot = query.from(Advert.class);         
        query.select(advertRoot);
        List<Predicate> criteria = new ArrayList<Predicate>();
        if(property != null){
            ParameterExpression<String> p =
                    criteriaBuilder.parameter(String.class, "property");
            criteria.add(criteriaBuilder.equal(advertRoot.get("property"), p));
        }
        if(property1 != null){
            ParameterExpression<String> p =
                    criteriaBuilder.parameter(String.class, "property1");
            criteria.add(criteriaBuilder.equal(advertRoot.get("property1"), p));
        }
        if (criteria.size() == 0) {
            throw new RuntimeException("no criteria");
        } else if (criteria.size() == 1) {
            query.where(criteria.get(0));
        } else {
            query.where(criteriaBuilder.and(criteria
                    .toArray(new Predicate[0])));
        }
        TypedQuery<Advert> q = em.createQuery(query);
        //set your query parameters here
        if (property != null) { q.setParameter("property", property); }
        if (property1 != null) { q.setParameter("property1", property1); }
        List<Advert> resultList = q.getResultList();
CriteriaBuilder-CriteriaBuilder=em.getCriteriaBuilder();
CriteriaQuery=criteriaBuilder.createQuery(Advert.class);
Root-adverroot=query.from(Advert.class);
查询。选择(根);
列表条件=新建ArrayList();
if(属性!=null){
参数表达式=
criteriaBuilder.parameter(String.class,“属性”);
add(criteriaBuilder.equal(adverroot.get(“property”),p));
}
如果(属性1!=null){
参数表达式=
参数(String.class,“property1”);
add(criteriaBuilder.equal(adverdroot.get(“property1”),p));
}
if(criteria.size()==0){
抛出新的RuntimeException(“无条件”);
}else if(criteria.size()==1){
query.where(criteria.get(0));
}否则{
query.where(criteriaBuilder.and(criteria
.toArray(新谓词[0]);
}
TypedQuery q=em.createQuery(查询);
//在此处设置查询参数
如果(property!=null){q.setParameter(“property”,property);}
如果(property1!=null){q.setParameter(“property1”,property1);}
List resultList=q.getResultList();

这就是CriteriaAPI的作用:动态构造查询。