如何在JPQL或HQL中检索实体的特定字段?JPQL或HQL中的ResultSet等价物是什么?

26

在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 的查询中检索信息?

4个回答

49

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书籍中看到像这样的查询:“select c.id,c.name from Category c”,但它们从未告诉你如何检索结果。有没有不使用Hibernate特定方法就可以做到这一点的方法? - Daud
1
使用JPA将以相同的方式工作。我在我的答案中添加了示例。但请注意,如果您仅选择名称列,则会获得List<String>而不是List<Object[]>。 - dimas
在这个上下文中,“session”变量是什么?至少在4.3版本中,“org.hibernate.Session”没有“createQuery”方法。 - P.Péter

12

.list()函数本身并没有使结果成为List<Object[]>,而是在HQL查询中指定了字段(c.id, c.name)。如果你的查询是这样的:

    "select c from Category c"

那么query.list()将返回一个List<Category>对象。


2
您可以直接映射到类。
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();
    }

0

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

更多信息请参见链接

甚至有一种更加优雅方式


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接