JPA自定义查询

JPA自定义查询,jpa,jpql,criteria-api,Jpa,Jpql,Criteria Api,我需要你的帮助。基本上,我想为我创建的视图创建一个自定义查询,该视图包含客户端所需的大部分数据。这里棘手的部分是,客户机可以指定搜索中要包含哪些列。示例查询如下所示: SELECT distinct s.empno FROM SesdbAllView s WHERE s.lastname IN :lname AND s.examTaken IN :exam AND s.training IN :train AND s.trainingFrom BETWEEN :from AND :

我需要你的帮助。基本上,我想为我创建的视图创建一个自定义查询,该视图包含客户端所需的大部分数据。这里棘手的部分是,客户机可以指定搜索中要包含哪些列。示例查询如下所示:

SELECT distinct s.empno FROM SesdbAllView s 
WHERE  s.lastname IN :lname  AND  s.examTaken IN :exam  AND
s.training IN :train  AND  s.trainingFrom BETWEEN :from AND :to  AND
s.eligibility IN :elig  AND  s.profession IN :prof
因此,我尝试将其转换为Criteria API,但仍然坚持如何操作,尤其是在关键字之间(我检查了
日期的范围,还检查了
整数的范围)。当涉及到IN关键字时,我不确定我是否也做得正确

我现在的代码是:

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Tuple> cq = cb.createTupleQuery();
    Root<SesdbAllView> r = cq.from(SesdbAllView.class); 
    Predicate p = cb.conjunction();
    for (Map.Entry<String, Object> param : parameters.entrySet()) {
        if (param.getValue() instanceof List) {
            Expression<String> exp = r.get(param.getKey()); 
            p = cb.and(p, exp.in((List<String>)param.getValue()));
        } else if (param.getValue() instanceof DateFromTo) {
            DateFromTo fromTo = (DateFromTo) param.getValue();
            p = cb.between(r.get(param.getKey()).as(Date.class),fromTo.getFrom(),fromTo.getTo());          
        } else if (param.getValue() instanceof IntegerFromTo) {
            IntegerFromTo fromTo = (IntegerFromTo) param.getValue(); 
            p = cb.between(r.get(param.getKey()).as(Integer.class),fromTo.getFrom(),fromTo.getTo());
        } else {
            p = cb.and(p, cb.equal(r.get(param.getKey()), param.getValue()));
        }
    } 
    cq.distinct(true);
    cq.multiselect(r.get("empNo"))
            .where(p); 
    List<Tuple> result = em.createQuery(cq).getResultList();
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery cq=cb.createTupleQuery();
根r=cq.from(SesdbAllView.class);
谓词p=cb.conjunction();
对于(Map.Entry参数:parameters.entrySet()){
if(param.getValue()instanceof List){
表达式exp=r.get(param.getKey());
p=cb.and(p,exp.in((List)param.getValue());
}else if(param.getValue()instanceof DateFromTo){
DateFromTo fromTo=(DateFromTo)param.getValue();
p=cb.between(r.get(param.getKey()).as(Date.class)、fromTo.getFrom()、fromTo.getTo());
}else if(IntegerFromTo的param.getValue()instanceof){
IntegerFromTo=(IntegerFromTo)param.getValue();
p=cb.between(r.get(param.getKey()).as(Integer.class)、fromTo.getFrom()、fromTo.getTo());
}否则{
p=cb.and(p,cb.equal(r.get(param.getKey()),param.getValue());
}
} 
cq.distinct(真);
cq.multiselect(r.get(“empNo”))
。其中(p);
List result=em.createQuery(cq.getResultList();

您真的需要
中间的
语句吗?我通常避免使用它,因为在不同的数据库中,它对于是否包含上界和下界有不同的含义。尝试对上界和下界使用两个单独的条件。并尝试在条件生成器中搜索
cast
运算符替代项。此外,我经常使用QueryDSL而不是criteria builder。@Alexeyanderev这不是真的。JPA规范非常清楚地指出,上界和下界都包含在内。请看JPA2.0规范中的“表达式之间的第4.6.8章”。