【问题标题】:How to get sum(boolean) as integer in hibernate's criteria query?如何在休眠的条件查询中将 sum(boolean) 作为整数?
【发布时间】:2026-01-09 01:15:01
【问题描述】:

在一个简单的“赞成/反对”场景中,我想总结“赞成”总数。

criteria.add(Restrictions.eq("vote" , Boolean.TRUE));
criteria.setProjection(Projections.rowCount());

生成的SQL是sum(this_.vote) as y1_,生成正确的sum值,但是hibernate把它解析为'boolean'值,都变成'true'了……

如何解决? (如果我不需要将“投票”从布尔值更改为整数)

环境:hibernate-3.6.0,jpa2

非常感谢!

【问题讨论】:

    标签: hibernate criteria


    【解决方案1】:

    您使用的是什么数据库?我认为您可能需要更改 hibernate 使用的方言。

    让 hibernate 使用 Tinyint 作为布尔变量。

    不在我工作的计算机自动取款机上 - 抱歉。如果这可能是正确的方向,请回复我,我稍后会举一个例子。

    这可能会帮助您同时开始:https://forum.hibernate.org/viewtopic.php?f=1&t=1008105

    干杯

    编辑:

    好的。由于您使用的是 Mysql,您可能希望扩展现有的 MySQL 方言 - 例如标准 MySQL5 方言:

     public class MySQL5DialectBooleanAsTinyint extends MySQL5Dialect {
    
      public MySQL5DialectBooleanAsTinyint() {
        super();
        registerColumnType(Types.BIT, "tinyint(1)");
      }
    
    }
    

    就是这样。要使用您的自定义方言,请相应地更改您的 hibernate.cfg:

     <property name="hibernate.dialect">your.package.structure.dao.MySQL5DialectBooleanAsTinyint</property> 
    

    【讨论】:

    • 嗨,我发现了另一个异常。该解决方案不适用于 projectionlist.add(Projections.sum("vote") , "sum"); Hibernate 仍然将返回的 int 视为布尔值。
    • Types.BIT 更改或添加 Types.BOOLEAN 也许这有帮助?
    • 糟糕,还是没用。
    • 总结一下: registerColumnType(Types.BIT, "tinyint(1)") 和 registerColumnType(Types.BOOLEAN, "tinyint(1)") ,都适用于criteria.add(Restrictions. eq("投票" , Boolean.TRUE)) ;标准.setProjection(Projections.rowCount()); ,但不适用于 projectionlist.add(Projections.sum("vote") , "sum");
    • 最后,我决定用HQL来解决这个问题:forum.hibernate.org/viewtopic.php?f=1&t=997522