Java Hibernate Projections.sqlGroupProjection 别名

标签 java mysql hibernate projection

我有一个像这样使用 Hibernate 的 Criteria

public class Student
{
    private Integer id,discriminatorColumn,discriminatorValue;
    //other stuff omitted for brevity
} 

该实体有一个 discriminatorColumn,其值从 1 到 10(绝不是 NULL),并且每个 discriminatorColumn 都有一个 discriminatorValue 其值从 1 到 100(绝不 NULL)

示例:(学生数据)

ID DiscriminatorColumn DiscriminatorValue
1            1                  3
2            2                  4
3            1                  13

所以。

我正在尝试获取按 DiscriminatorColumn 分组的 DiscriminatorValueSUM

我的意思是,在前面的示例中,如果我按 DiscriminatorColumn = 1 进行过滤,我将收到 SUM=16

final Criteria criteria = session.createCriteria(Student.class)
.setProjection(Projections.sqlGroupProjection(
    "sum({alias}.discriminatorValue) as rowCount",
    "hibernateAlias.discriminatorColumn having rowCount>0",
    new String[]{"rowCount"},
    Helper.HIBERNATE_INTEGER_INSTANCE
 ));

这将创建rightSQL我看到类似这样的内容

select sum(discriminatorValue) as rowCount
from student
group by discriminator_column
having rowCount>0

我遇到的问题是,当我将 resultSetTransformer 设置为 Student.class 时,我找不到 Hibernate 填充 discriminatorValuesum 的方式discriminatorValue Java 字段中的列结果。

我认为为此目的可以使用以下参数new String[]{"rowCount"}

但是我已经尝试过了

new String[]{"discriminatorValue"}
new String[]{"this.discriminatorValue"}
new String[]{"{alias}.discriminatorValue"}
new String[]{"{studentAlias}.discriminatorValue"} using alias in Criteria
new String[]{"rowCount as discriminatorValue"} 
new String[]{"rowCount as this_.discriminatorValue"}
and So On..

但似乎不可能我做错了什么?这是不可能的? 对值进行求和,将其设置为简单的属性,就像从数据库中检索常规

我为此编写了自己的变压器,但这有点烦人。

最佳答案

我找到了答案:

Projections.sqlGroupProjection("sum({alias}.discriminatorValue) as rowCount","hibernateAlias.discriminatorColumn having rowCount>0",new String[]{"rowCount"},Helper.HIBERNATE_INTEGER_INSTANCE)

似乎 new String[]{"rowCount"} 中的 rowCount 别名仅适用于 MySQL 语法,或者只是被 Criteria 引擎忽略如果您需要使用别名来填充 EntityClass 的属性,请使用外部别名

示例:

yourProjections.add(Projections.alias(Projections.sqlGroupProjection("sum({alias}.discriminatorValue) as rowCount","hibernateAlias.discriminatorColumn having rowCount>0",new String[]{"rowCount"},Helper.HIBERNATE_INTEGER_INSTANCE),"discriminatorValue"));

只需将 sqlGroupProjections 包装在 Projection.alias 中,设置别名与 Java 类中的属性匹配,Hibernate 将填充总和结果,而不是 不再需要自定义变压器

关于Java Hibernate Projections.sqlGroupProjection 别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30215528/

相关文章:

java - Android onCreateOptionMenu 没有被调用

mysql - 在查询中比较 50,45 和 44,45

java - 在 hibernate 中添加一个懒惰的 child

oracle - 如何在 Hibernate 查询语言中执行左连接?

java - java中如何设置JPanel的大小

java - 如何在 Android 中为 fragment 添加标题

java - 根据类中已有字段自动生成Java代码

PHP表单验证提交问题

mysql - 在其他表中选择条件时获取数据

java - 二级缓存中缓存了什么?