【问题标题】:JPQL return list of numbers in NamedQuery (with group by)NamedQuery 中的 JPQL 返回数字列表(带分组依据)
【发布时间】:2013-01-18 17:40:47
【问题描述】:

我想创建一个查询,该查询返回存储在数据库中的实体客户端的所有 roomId。 roomId 是 Client 实体中的一个属性。

我想使用这样的类型安全构造:

TypedQuery<Set<Long>> q = em.createNamedQuery("getRoomIdsByServer", Set.class);
q.setAttribute("server",server);

但是这会产生编译错误。

NamedQuery 可能看起来像这样:

@NamedQuery(name = "getRoomIdsByServer", query = "SELECT c.room_id FROM Client c WHERE c.server = :server GROUP BY c.room_id")

但这似乎超出了 JPQL 的范围。 我们正在使用 openJPA(版本 2.2.1)

有一种解决方案可以解决这个问题使用类型化查询,请参阅https://stackoverflow.com/a/6956037/1448704
但我想使用类型化查询来防止那些讨厌的强制转换操作。

【问题讨论】:

    标签: java jpa jpql openjpa


    【解决方案1】:

    没有必要在你的 TypedQuery 中转换 &lt;long&gt;。看这个;

        TypedQuery<Set> q = em.createNamedQuery("getRoomIdsByServer", Set.class);
        q.setAttribute("server",server);
    

    或者你可以这样使用;

        public List<String> getAllRoomIds(String server) {
              return em.createNamedQuery("getRoomIdsByServer", Set.class).setParameter("server", server).getResultList();
         }
    

    【讨论】:

    • 不幸的是,那时需要投射。该接口将查询的返回类型定义为“List”。 TypedQuery q = em.createNamedQuery("getRoomsIdsByServer", List.class);不能转换为 List!错误将是:类型不匹配:无法从 List 转换为 List,对于 TypedQuery,它不能转换为 List
    • 另一个问题是如果没有找到roomId,列表不会是“空的”,它会返回一个包含一个条目的列表,并且该条目将为空。因为这正是查询的结果,“分组依据”将总是返回一条记录,即使表是空的。
    猜你喜欢
    • 2021-01-27
    • 2016-09-26
    • 1970-01-01
    • 2016-05-18
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多