【问题标题】:Convert string to int in Hibernate order criterion在休眠顺序标准中将字符串转换为 int
【发布时间】:2012-07-18 16:07:12
【问题描述】:

基本上,我的问题和这个问题一样,但是对于 Java 的(JBoss)Hibernate:How can we order a column as int using hibernate criteria API?

我想通过从字符串列强制转换为 int 创建一个订单限制。类似的东西

criteria.addOrder(Order.asc("cast(id as int)"));

例外是“无法解析属性:[Class] 的 cast(id as int)”。我已经用 int 和 integer 尝试了 cast(as) 和 convert(,)。

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    尽管这个话题很老,可能问题已经解决了,但我会发布解决方案。也许它将来会对某人有所帮助。

    criteria.addOrder(new org.hibernate.criterion.Order("anystring", true) {
                @Override
                public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
                    return "cast(id as int)";
                }
            });
    

    【讨论】:

    • 如果您不想指定升序或降序,此解决方案有效,因为在原始 toSqlString 方法中使用了第二个参数。如果你覆盖它,你必须自己在字符串的末尾添加 asc 或 desc。
    • KarolR,这就是为什么调用toSqlString的方法。您可以根据需要编写自己的订单,但您应该指定整个订单字符串。还有一个——顺序总是有方向的,默认情况下使用“asc”,所以“cast(id as int)”实际上是“cast(id as int) asc”,但你可以跳过它。你可以指定复杂的排序,hibernate应该如何决定把方向放在哪里,这被指定为参数?
    • 这确实很有帮助,而且您只是让我免于花费大量时间将我的标准代码重构为 sql 以解决订单问题。为您的 cmets 和答案 +1。
    【解决方案2】:

    如果列包含整数值,最好的解决方案是将其映射为整数而不是字符串。

    如果由于不明原因无法做到这一点,您可以在您的实体中添加一个带有 @Formula("cast(id) as number") 注释的整数字段并在该字段上排序。

    【讨论】:

    • 由于通用调用和一些带有字符串标识符的表,因此决定将所有内容都转换为字符串。无论如何,由于 maven 构建(在 hibernate3-maven-plugin 中)上的错误异常,我无法使用公式注释,所以我无法测试它,我将把这个问题留在待机状态. Tks
    • 应该是@Formula("cast(id as NUMBER(10,0))")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 2012-05-19
    • 2012-01-26
    相关资源
    最近更新 更多