【问题标题】:Casting expression's result in criteria api将表达式的结果转换为标准 api
【发布时间】:2020-01-18 10:55:03
【问题描述】:

我有这个代码:

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】:

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

    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();
    

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

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

    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

    <!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>
    

    【讨论】:

    • 我不明白你的变种?我想从字段 fam 中提取数字,例如 ("123-asd","13345-gus") 并找到这个数字的最大值 (max(123,13345)) 并得到一个结果
    • 假设您使用 oracle 数据库,我已经更新了我的答案。
    猜你喜欢
    • 2018-01-25
    • 2015-02-15
    • 2016-01-12
    • 2018-11-20
    • 2021-01-11
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多