如何仅检索 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,它的工作方式相同。我在答案中添加了示例。但请注意,例如,如果您只选择名称列 - 那么您将获得 Listsession
变量是什么? org.hibernate.Session
没有 createQuery
方法,至少在 4.3 中。【参考方案2】:
不是.list()
函数本身的使用导致结果为List<Object[]>
。它是 HQL 查询中的字段规范 (c.id, c.name
)。如果您的查询是
"select c from Category c"
然后query.list()
将返回一个List<Category>
对象。
【讨论】:
【参考方案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 查询
使用 JPQL 或条件 API 在省略某些字段的同时恢复具有相关实体的实体列表