如何仅检索 JPQL 或 HQL 中实体的某些字段? JPQL 或 HQL 中的 ResultSet 等价物是啥?

Posted

技术标签:

【中文标题】如何仅检索 JPQL 或 HQL 中实体的某些字段? JPQL 或 HQL 中的 ResultSet 等价物是啥?【英文标题】:How to retrieve only certain fields of an entity in JPQL or HQL? What is the equivalent of ResultSet in JPQL or HQL?如何仅检索 JPQL 或 HQL 中实体的某些字段? JPQL 或 HQL 中的 ResultSet 等价物是什么? 【发布时间】:2012-08-02 05:01:08 【问题描述】:

在 JPQL 中,我可以通过以下方式检索实体:

query = entityManager.createQuery("select c from Category c");
List<Category> categories = query.getResultList();

但是,如果我希望(仅)检索 Category 实体的 id 和 name 字段,我需要类似 ResultSet 的对象,通过它我可以说:rs.getString("name")rs.getString("id")。如何通过JPQL 做到这一点,而不检索整个实体?

基本上,关于如何从查询中检索信息,例如:select c.id,c.name from Category c

【问题讨论】:

【参考方案1】:

在 HQL 中,您可以使用 list() 函数获取包含结果行的 Object[] 数组的列表:

Query query = session.createQuery("select c.id,c.name from Category c");
List<Object[]> rows = query.list();

在返回的数组中,第一个元素将是 id,第二个 - 名称。

for (Object[] row: rows) 
    System.out.println(" ------------------- ");
    System.out.println("id: " + row[0]);
    System.out.println("name: " + row[1]);

如果你想使用hibernate的Criteria API,你应该使用Projections。

使用 JPA,它的工作方式相同:

List<Object[]> rows = entityManager.createQuery(queryString).getResultList();

【讨论】:

我经常在 JPA 书籍中看到诸如“从类别 c 中选择 c.id,c.name”之类的查询,但它们从未告诉您如何检索结果。有什么方法可以在不特定于 Hibernate 的情况下做到这一点? 使用 JPA,它的工作方式相同。我在答案中添加了示例。但请注意,例如,如果您只选择名称列 - 那么您将获得 List,而不是 List. 在这种情况下,session 变量是什么? org.hibernate.Session 没有 createQuery 方法,至少在 4.3 中。【参考方案2】:

不是.list() 函数本身的使用导致结果为List&lt;Object[]&gt;。它是 HQL 查询中的字段规范 (c.id, c.name)。如果您的查询是

    "select c from Category c"

然后query.list() 将返回一个List&lt;Category&gt; 对象。

【讨论】:

【参考方案3】:

也可以直接映射到类

public class UserData 

    private String name;
    private Date dob;
    private String password;
//setter




  public UserData getUserData() 
        String queryString = "select user.name as name, user.dob as dob, user.userses.password as password from UserProfile user where user.userEmailId='faiz.krm@gmail.com'";
        Query query = sessionFactory.getCurrentSession().createQuery(queryString);
        query.setResultTransformer(Transformers.aliasToBean(UserData.class));
        return query.uniqueResult();
    

【讨论】:

【参考方案4】:

JPA 规范允许我们以面向对象的方式自定义结果。

您可以在link找到更多信息

还有一个更优雅 way

【讨论】:

以上是关于如何仅检索 JPQL 或 HQL 中实体的某些字段? JPQL 或 HQL 中的 ResultSet 等价物是啥?的主要内容,如果未能解决你的问题,请参考以下文章

具有嵌套查询和 UUID 数组字段的 HQL/JPQL 查询

HQL:如何选择某些列不同的所有实体?

使用 JPQL 或条件 API 在省略某些字段的同时恢复具有相关实体的实体列表

如何在 IntelliJ 12 中启用 HQL/JPQL 自动完成

如何在 jpql 查询中仅查询超类实体?

SQL,HQL,CQL,JPQL了解