Hibernate Projections.min()返回多行

时间:2012-02-28 10:38:31

标签: java hibernate null projection min

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

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

实现的接口
  

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

以下是示例代码的问题:

Criteria c = getSession().createCriteria(samplesType)
    .setProjection(Projections.min("pollingTime"));
List resultList= c.list()`enter code here`;

执行 .list()后,resultList中有三个值: First为null,Second为null,Third包含我正在寻找的正确最小值。

我正在使用c.uniqueResult(),但它“返回”

  

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

我也尝试过使用hibernate的

createQuery(select min(pollingTime) from tableName).list()

但结果相同(两个空值和一个结果正确)。

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

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

createSQLQuery("SELECT MIN(pool_time) FROM tableName") 

这是当下唯一的解决方案。

您对退回的结果不正确有什么想法吗?

此致 尼基

3 个答案:

答案 0 :(得分:2)

我认为你应该弄清楚它们的来源,而不是专注于从列表中删除null。我想知道,您是否有表格行,其中该列的值为NULL?也许你应该尝试类似的东西:

    select min(r.pollingTime) from r : tableName where r.pollingTime != NULL

答案 1 :(得分:1)

根据您的数据类型,整数和字符串的最小值可能不同。例如,如果作为整数11取1,1,11是最大值。但如果作为字符串2,则最多

验证列的数据类型是什么。

答案 2 :(得分:1)

我找到了返回此null的原因。 正如我所描述的那样,系统中存在一些继承。 因此,在基类表中搜索最小值时,hibernate会尝试查找所有子类表的最小值。 在我们的例子中,子类的表是空的,因此没有最小值,因此它与子类表中的空值一起找到了正确的值。

作为问题的解决方案,我在hibernate映射文件中将多态性设置为显式:

<class name="class" table="TABLE" polymorphism="explicit">

以上在搜索超类表时禁用在指定表中的搜索。

尼基