2012-02-28 84 views
3

我试图得到一个表中的列的最小值。这听起来微不足道,但我遇到问题(我正在使用MySql 5.1数据库)。休眠Projections.min()返回了多行

的情况有点复杂。 我们有一个从两个类实现的接口。 这两个类别的每一个都从另外三个类别扩展而来。 每两根这三个extendors的具有休眠映射(基类还具有映射)=>所以我们有 接口I由

实施

CLASSA(映射)由classA1(映射),classA2(映射)扩展, classA3通过classB1(映射), classB2(映射),classB3(未映射)

下面是一个例子代码问题伸展(未映射)CLASSB(映射):

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

.LIST()执行后有三个值中resultList: 首先为空,其次为null,第三个包含我正在寻找正确的最小值。

我用c.uniqueResult()但 “收益”

org.hibernate.NonUniqueResultException:查询未返回唯一结果 :3

我也试着使用Hibernate的

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

但结果是一样的(两个空值和一个正确的结果)。

我也尝试添加预定使用ResultTransformer以从列表中删除空值,但我失败了。

作为一种变通方法,我可以使用SQL查询得到所需要的最低值:

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

这是当下唯一的解决办法。

你有什么想法,为什么返回的结果是不正确的?

问候, 尼基

回答

1

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

作为解决我在休眠映射文件多态性设置为明确的问题:

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

上述禁止搜索在指定的表,而搜索的超类表。

Niki

2

,而不是着眼于从列表中移除null S,我想你应该找出他们的来源。我想知道,你有表格行,其中该列的值是NULL?也许你应该尝试这样的:

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

事实上,这是我直接用MySQL查询浏览器检查的第一件事情之一。此栏中没有任何空值。 考虑到该列不是唯一键并且没有设置为无效,这是一个很好的观点。 Niki 编辑:我也同意最好找出为什么我得到空值而不是找到一种方法来从结果中筛选它们。 – user1228603 2012-02-28 11:38:29

+0

我也试过下面的代码。 String qryStr =“select min(tn.pollingTime)from”+ tableName +“tn where tn.pollingTime!= NULL”; List resultList = getSession()。createQuery(qryStr).list(); 列表中的结果现在颠倒过来: minValue,null,null。 它看起来,只要我使用休眠(查询,creteria,投影等)为这个任务它返回错误的结果。 – user1228603 2012-02-28 13:31:38

1

根据你的数据类型,整数和字符串的最小值可能会不同。例如,如果将整数11视为最大值,则为1,2,11。但如果作为一个字符串2是最大的。

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

+0

所有映射文件中的数据类型都很长。它包含以毫秒为单位存储在类和db中的时间(按照在hibernate映射中定义的时间)。 – user1228603 2012-02-28 13:16:32