【问题标题】:Using Projection query in JPA在 JPA 中使用投影查询
【发布时间】:2014-07-04 06:36:36
【问题描述】:

我知道 JPA 中有一个特性,它只获取我们需要的实体的那些属性,它被称为投影查询。

大多数 Datastore 查询会返回整个实体作为结果,但通常应用程序实际上只对实体的少数属性感兴趣。投影查询允许您在数据存储区中查询您实际需要的实体的那些特定属性,与检索整个实体相比,延迟和成本更低。

我正在寻找投影查询的实现,但似乎这方面的资源较少。

我有一个 USER 表,有 50 列。我只需要从该表中检索 5 列作为实体列表。这是为了在 JSF 数据表中显示它。

如何使用投影查询来实现这一点?还是有更好的选择?

【问题讨论】:

    标签: java jpa


    【解决方案1】:
    select u.id, u.name, u.birthDate from User u
    

    这将返回一个List<Object[]>。列表中的每个Object[] 都将包含一个用户 ID、一个用户名和一个用户出生日期。

    您可以像常规查询一样执行它:

    Query q = em.createQuery(jpql);
    List<Object[]> users = q.getResultList();
    

    【讨论】:

    • 它正在工作。对象数组现在包含 id & name 。我怎样才能用这些数据填充我的用户实体。现在我可以使用 user.setId(((Object[])userObject)[0]) , user.setName(((Object[])userObject)[1]) 设置用户实体。有没有其他方法可以实现。我需要仅填充 id 和 name 的 User 实体,并保持为空。将对象转换为我的实体用户对象,可能吗?
    • 您不应该使用此数据填充用户实体。使用另一个类,只包含那些字段。否则,在 2 周内,您将致电 user.getBirthLocation() 并想知道为什么您会得到空值。也就是说,是的,您必须遍历列表并将每个对象数组转换为 UserBasicInformation(例如)对象。
    猜你喜欢
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 2012-04-05
    • 2019-02-09
    • 1970-01-01
    • 2019-02-26
    • 2020-07-26
    • 1970-01-01
    相关资源
    最近更新 更多