【问题标题】:Non-empty list with null elements returned from Hibernate query从 Hibernate 查询返回的具有空元素的非空列表
【发布时间】:2011-02-16 06:17:23
【问题描述】:

我是休眠新手,所以不确定这是否是预期的行为:

Session session = (Session)entityManager.getDelegate();
Criteria criteria = session.createCriteria(myRequest.class);
criteria.add(Restrictions.eq("username", username));
criteria.setProjection(Projections.max("accesscount"));
List<myRequest> results = criteria.list();

返回的结果是一个包含单个空元素的非空列表。

我想不出它为什么会这样,不知道这是预期的行为还是我做错了什么?

系统处于休眠状态/Syabse。

谢谢。

【问题讨论】:

    标签: java hibernate sybase


    【解决方案1】:

    只有使用该用户名的用户在 accesscount 列中具有非空值时才会感到惊讶。您的返回类型使人们相信您正在尝试获取具有最大访问计数的 myRequest 实例?这不是该查询所做的。查询相当于

    select max(m.accesscount) from myRequest m where m.username = :username
    

    它只是(试图)返回一个数字,而不是一个 myRequest。

    【讨论】:

    • 谢谢!这就是我想要做的,知道相应的休眠查询是什么吗? ...我非常希望避免明显的顺序,然后先选择,再次感谢。
    • 很难说没有看到整张桌子。 username + accesscount 是唯一的吗?选择 m from myRequest m where m.username = :username and accesscount = (select max(m.accesscount) from myRequest m where m.username = :username) ???不保证返回单个结果。
    • 假设我们假设总是有一个唯一的最大访问权限,我将如何处理它?我的主要问题实际上在于如何在 SQL 的休眠版本中获得“拥有 max(m.accesscount)”。
    • 拥有 max(accesscount) 什么?拥有是一个限制条款,您需要将其与某物进行比较。最大(访问次数)> 0?最大(访问计数)不为空?如果 username + accesscount 是唯一的,那么上面给出的查询将起作用。如果您想要一个托管实体作为您的返回类型,那么使用分组的问题是您必须将对象上的每个属性都放入 group by 子句中。这可能会使您很难获得一开始就执行您想要的聚合的查询! :)
    • 查看您的整体架构和性能需求并确定是否更容易编写一个返回所需实体 ID 的标量查询,然后执行 findById 可能会有所帮助。如果它是可能在 L2 缓存中命中的高流量项目,或者甚至是会话缓存中已有数据集合的一部分,那么您实际上仍然只执行一个查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 2018-04-04
    • 2018-01-11
    • 2017-06-05
    • 2016-03-31
    • 1970-01-01
    • 2012-10-29
    相关资源
    最近更新 更多