首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate Projections.min()返回多行

Hibernate Projections.min()返回多行
EN

Stack Overflow用户
提问于 2012-02-28 10:38:30
回答 3查看 2.2K关注 0票数 3

我正在尝试获取表中列的最小值。这听起来微不足道,但我遇到了问题(我正在使用MySql 5.1数据库)。

情况有点复杂。我们有一个接口,它是由两个类实现的。这两个类的每一个都是从另外三个类扩展而来的。这三个扩展器中的每两个都有hibernate映射(基类也有映射) =>,所以我们有一个接口I

classA(映射)由classA1(映射)、classA2(映射)、classA3(未映射)classB(映射)扩展(映射)、classB2(映射)、classB3(未映射)扩展

下面是一个示例代码的问题:

代码语言:javascript
复制
Criteria c = getSession().createCriteria(samplesType)
    .setProjection(Projections.min("pollingTime"));
List resultList= c.list()`enter code here`;

在执行.list()之后,resultList中有三个值:第一个是null,第二个是null,第三个是我想要的正确的最小值。

我使用的是c.uniqueResult(),但它“返回”

org.hibernate.NonUniqueResultException:查询没有返回唯一的结果:3

我也尝试过使用hibernate的

代码语言:javascript
复制
createQuery(select min(pollingTime) from tableName).list()

但是结果是相同的(两个空,一个有正确的结果)。

我还尝试添加预定义的ResultTransformer以从列表中删除空值,但失败了。

作为解决办法,我可以使用sql查询获得所需的最小值:

代码语言:javascript
复制
createSQLQuery("SELECT MIN(pool_time) FROM tableName") 

这是目前唯一的解决办法。

你知道为什么返回的结果不正确吗?

你好,Niki

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-29 07:22:43

我找到了归还这条明渠的原因。正如我所描述的,系统中有一些继承。因此,在搜索基类表中的最小值时,hibernate试图为所有子类表找到最小值。在我们的例子中,子类的表是空的,因此没有最小值,因此它创建了正确的值以及子类表中的空值。

为了解决这个问题,我在hibernate映射文件中将多态性设置为显式:

代码语言:javascript
复制
<class name="class" table="TABLE" polymorphism="explicit">

在搜索超类表时,上述内容将禁用在指定表中的搜索。

妮基

票数 1
EN

Stack Overflow用户

发布于 2012-02-28 11:11:43

与其专注于从列表中删除null,我认为您应该找出它们的来源。我想知道,该列的值为NULL的表行有哪些?也许你应该尝试这样的方法:

代码语言:javascript
复制
    select min(r.pollingTime) from r : tableName where r.pollingTime != NULL
票数 2
EN

Stack Overflow用户

发布于 2012-02-28 12:27:22

根据数据类型的不同,整数和字符串的min值可能不同。例如,如果将1、2、11作为整数11,则为max。但如果作为字符串2是最大值。

验证列的数据类型。

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

https://stackoverflow.com/questions/9480369

复制
相关文章

相似问题

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