首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Projections.sqlGroupProjection混叠

Java Projections.sqlGroupProjection混叠
EN

Stack Overflow用户
提问于 2015-05-13 12:59:27
回答 1查看 5.6K关注 0票数 1

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

代码语言:javascript
复制
public class Student
{
    private Integer id,discriminatorColumn,discriminatorValue;
    //other stuff omitted for brevity
} 

这个实体有一个discriminatorColumn,值从1到10 (从不NULL),每个discriminatorColumn都有一个discriminatorValue,它的值来自1 to 100 (从不NULL)。

示例:(学生数据)

代码语言:javascript
复制
ID DiscriminatorColumn DiscriminatorValue
1            1                  3
2            2                  4
3            1                  13

所以。

我正在尝试通过SUM获得一个DiscriminatorValue分组的DiscriminatorColumn

我的意思是,在前面的例子中,如果我使用DiscriminatorColumn = 1进行过滤,我就会收到SUM=16

代码语言:javascript
复制
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

代码语言:javascript
复制
select sum(discriminatorValue) as rowCount
from student
group by discriminator_column
having rowCount>0

我遇到的问题是,当我将resultSetTransformer设置为Student.class时,无法找到Hibernate填充sum of discriminatorValue列的方式,从而在discriminatorValue Java字段中得到结果。

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

但我试过了

代码语言:javascript
复制
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..

但似乎不可能我做错了什么?不可能吗?Sum the values as set it as a simple Property as retrieving regular from database

我已经写了我自己的变压器,但这有点烦人。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-14 11:46:40

我找到了答案:

代码语言:javascript
复制
Projections.sqlGroupProjection("sum({alias}.discriminatorValue) as rowCount","hibernateAlias.discriminatorColumn having rowCount>0",new String[]{"rowCount"},Helper.HIBERNATE_INTEGER_INSTANCE)

似乎rowCount混叠在new String[]{"rowCount"}中只是为了MySQL语法或者被Criteria engine忽略了,您需要使用别名来填充EntityClass use outer alias instead的属性。

示例:

代码语言:javascript
复制
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就会填充和结果,而不是custom transformer are not longer required

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30215528

复制
相关文章

相似问题

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