【问题标题】:Hibernate Projections.min() returned multiple rowsHibernate Projections.min() 返回多行
【发布时间】:2012-03-17 19:58:10
【问题描述】:

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

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

classA(mapped) 由 classA1(mapped) 、 classA2(mapped) 扩展, classA3(not mapped) classB(mapped) 由 classB1(mapped) 扩展, classB2(mapped) , classB3(not mapped)

这是一个示例代码的问题:

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

.list() 执行后,resultList 中有三个值: 第一个为空,第二个为空,第三个包含我要查找的正确最小值。

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

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

我也试过用hibernate的

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

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

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

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

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

这是目前唯一的解决方案。

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

问候, 尼基

【问题讨论】:

    标签: java hibernate null projection min


    【解决方案1】:

    与其专注于从列表中删除nulls,我认为您应该弄清楚它们来自哪里。我想知道,您是否有该列的值为NULL 的表行?也许您应该尝试以下方法:

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

    【讨论】:

    • 事实上,这是我使用 MySQL 查询浏览器直接检查的第一件事。此列中没有任何空值。考虑到此列不是唯一键并且未设置为不可为空,这是一个很好的观点。 Niki Edit:我也同意最好找出我得到空值的原因,而不是找到一种从结果中过滤它们的方法。
    • 我也试过下面的代码。 String qryStr = "select min(tn.pollingTime) from " + tableName + " tn where tn.pollingTime != NULL";列出 resultList = getSession().createQuery(qryStr).list();列表中的结果现在颠倒了:minValue、null、null。看起来,一旦我对这个任务使用休眠(查询、creteria、投影等),它就会返回错误的结果。
    【解决方案2】:

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

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

    【讨论】:

    • 所有映射文件中的数据类型都是long。它包含以毫秒为单位存储在类和数据库中的 long 时间(根据休眠映射中的定义)。
    【解决方案3】:

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

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

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

    上述方法在搜索超类表时禁用在指定表中的搜索。

    尼基

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2021-10-19
      • 2010-12-31
      • 2019-02-22
      • 2021-07-13
      相关资源
      最近更新 更多