在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
?
答案 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)