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

时间:2012-08-04 10:06:27

标签: hibernate orm hql jpql

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

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

但是,如果我希望检索Category实体的id和name字段(仅),我需要类似ResultSet对象的东西,我可以通过它来说:rs.getString("name")和{{1 }}。如何通过rs.getString("id")执行此操作,而无需检索整个实体?

基本上,如何从查询中检索信息,例如:JPQL

4 个答案:

答案 0 :(得分:39)

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

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

1-st元素将是id,second-name。

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();

答案 1 :(得分:11)

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

    "select c from Category c"

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

答案 2 :(得分:1)

您也可以直接映射到课程

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();
    }

答案 3 :(得分:0)

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

您可以在此link

中找到更多信息

优雅 way