JPA自定义查询

时间:2013-11-28 01:53:31

标签: 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 :to  AND
s.eligibility IN :elig  AND  s.profession IN :prof

所以我尝试将其转换为Criteria API,但仍然坚持如何做到这一点,特别是在BETWEEN关键字中(我检查Date的范围,另一个检查Integer)。当谈到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();

0 个答案:

没有答案