在EclipseLink中向CriteriaBuilder添加复杂的选择?

时间:2015-01-21 07:04:58

标签: java eclipselink

我想在日期coloumn上添加一些更复杂的选项

select TO_DATE ('04-JAN-2015','DD-MM-YYYY'), to_char(TO_DATE ('04-JAN-2015','DD-MM-YYYY'), 'FMDAY') day,
       (case when to_char(trunc(TO_DATE ('04-JAN-2015','DD-MM-YYYY'), 'mm'), 'FMDAY') = 'SUNDAY' then to_number(to_char(TO_DATE ('04-JAN-2015','DD-MM-YYYY'), 'W'))
             else ceil((to_char(TO_DATE ('04-JAN-2015','DD-MM-YYYY'), 'dd') + 1 - to_char(next_day(trunc(TO_DATE ('04-JAN-2015','DD-MM-YYYY'), 'mm'), 'SUNDAY'), 'dd'))/7)
        end)+1 week_no
from dual

这里breakupFields是指向日期列

的字符串列表
final QueryBuilder distinctDateTimeFilter = new QueryBuilder() {
final List<String> breakupFields = new ArrayList<String>(fields.length);
        for (final String f : fields) 
            if (!Strings.isEmpty(f)) {
                breakupFields.add(f);
            }
        }
         final QueryBuilder distinctDateTimeFilter = new QueryBuilder() {
            @Override
        public CriteriaQuery buildQuery(CriteriaBuilder cb, CriteriaQuery query, Predicate p, List orders, Root rt) {

            Expression selection = null;

            selection = cb.function("TO_CHAR", String.class, cb.sum(CriteriaQueryUtils.getPath(rt, breakupFields), cb.literal(miliSecToAdd)),
                            cb.literal("W-MM-YYYY"));

         return query.select(selection).distinct(true).where(p).orderBy(orders);
         }
         }

    final List<Object> objs = new ArrayList<Object>(ds.executeQuery(classObject, Object.class, distinctDateTimeFilter, ef, session,

            SuperUserSecurityContext.class));

任何人都可以建议如何添加

(case when to_char(trunc(TO_DATE ('04-JAN-2015','DD-MM-YYYY'), 'mm'), 'FMDAY') = 'SUNDAY' then to_number(to_char(TO_DATE ('04-JAN-2015','DD-MM-YYYY'), 'W'))
             else ceil((to_char(TO_DATE ('04-JAN-2015','DD-MM-YYYY'), 'dd') + 1 - to_char(next_day(trunc(TO_DATE ('04-JAN-2015','DD-MM-YYYY'), 'mm'), 'SUNDAY'), 'dd'))/7)
        end)+1 to criteria builder

1 个答案:

答案 0 :(得分:0)

您可以在实体中引入标记为

的列
@Formula(value="the expression")

查看更多here并使用查询中的列。

或者您可以使用映射的所需实体类定义本机SQL查询,并使用fuly native SQL。