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章”。