在标准api中铸造表达式的结果

问题描述 投票:1回答:1

我有此代码:

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Integer> criteriaQuery = criteriaBuilder.createQuery(Integer.class);

Root<Teacher> c = criteriaQuery.from(Teacher.class);

Expression s = criteriaBuilder.locate(c.<String>get("fam"), "-").as(Integer.class);

Integer lastIndex = Integer.valueOf(s.toString());

criteriaQuery.select(criteriaBuilder.max(criteriaBuilder.substring(c.<String>get("fam"),  1, lastIndex-1).as(Integer.class)));

Integer aaa = em.createQuery(criteriaQuery).getSingleResult();

s变量给我整数。我想将其用作substring函数的参数。我怎样才能做到这一点?此方法无效。

hibernate jpa substring criteria-api
1个回答
0
投票

您可以使用类似这样的内容:

Expression<Integer> s = criteriaBuilder.locate(c.get("fam"), "-");
Expression<Integer> one = criteriaBuilder.literal(1);

criteriaQuery.select(
   criteriaBuilder.max(
      criteriaBuilder.length(
         criteriaBuilder.substring(
            c.get("fam"),
            one,
            criteriaBuilder.diff(s, one)
         )
      )
   )
);

Integer aaa = em.createQuery(criteriaQuery).getSingleResult();

请注意,不能将criteriaBuilder.max应用于criteriaBuilder.substring的输出。因为criteriaBuilder.substring返回Expression<String>,但是criteriaBuilder.max期望获得Expression<N extends Number>

© www.soinside.com 2019 - 2024. All rights reserved.