25

在 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

4 回答 4

47

在 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();
于 2012-08-04T10:23:20.617 回答
12

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

    "select c from Category c"

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

于 2012-08-04T18:20:04.977 回答
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();
    }
于 2018-09-23T15:32:48.343 回答
0

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

您可以在此链接中找到更多信息

还有一种更优雅的 方式

于 2020-10-31T11:37:15.470 回答