首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在criteria api中转换表达式的结果

在criteria api中转换表达式的结果
EN

Stack Overflow用户
提问于 2020-01-18 18:55:03
回答 1查看 481关注 0票数 1

我有这样的代码:

代码语言:javascript
复制
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函数的一个参数。我该怎么做呢?这种方法不起作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-19 06:36:31

您可以使用以下解决方案:

代码语言:javascript
复制
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Integer> criteria = builder.createQuery(Integer.class);
Root<Teacher> root = criteria.from(Teacher.class);

Expression<Integer> exp = builder.locate(root.get("fam"), "-");
Expression<Integer> one = builder.literal(1);

Expression<String> numberAsString = builder.substring(
   root.get("fam"),
   one,
   builder.diff(exp, one)
);

Expression<Integer> toNumber = builder.function(
  "TO_NUMBER",
  Integer.class,
  numberAsString
);

criteria.select(
   builder.max(toNumber)
);

Integer result = session.createQuery( criteria ).getSingleResult();

在这段代码中,我假设您使用的是oracle数据库。TO_NUMBER函数是oracle特有的函数,它将第一个参数转换为oracle数据类型的值。我想所有的数据库都应该有类似的功能。

还请注意,由于使用了HHH-11938TO_NUMBER函数应该用您的hibernate方言声明。在我的例子中,这个函数没有在org.hibernate.dialect.Oracle12cDialect中声明。所以,我用下面的方式扩展了这个方言:

代码语言:javascript
复制
import org.hibernate.dialect.Oracle12cDialect;
import org.hibernate.dialect.function.StandardSQLFunction;
import org.hibernate.type.StandardBasicTypes;

public class MyOracleDialect extends Oracle12cDialect
{
   public MyOracleDialect()
   {
      super();
      registerFunction("to_number", new StandardSQLFunction("to_number", StandardBasicTypes.INTEGER) );
   }
}

,然后在hibernate配置hibernate.cfg.xml中使用它。

代码语言:javascript
复制
<!DOCTYPE hibernate-configuration SYSTEM "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.dialect">com.sternkn.hibernate.MyOracleDialect</property>
        ...
    </session-factory>
</hibernate-configuration>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59799864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档