我试图获取表中列的最小值。这听起来微不足道,但我遇到了问题(我使用的是 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")
这是当下唯一的解决方案。
您对退回的结果不正确有什么想法吗?
此致 尼基
答案 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">
以上在搜索超类表时禁用在指定表中的搜索。
尼基