JPQLでは、次の方法でエンティティを取得できます。
query = entityManager.createQuery("select c from Category c");
List<Category> categories = query.getResultList();
ただし、CategoryエンティティのIDフィールドと名前フィールド(のみ)を取得する場合は、rs.getString("name")
およびrs.getString("id")
。エンティティ全体を取得せずにJPQL
を介してこれを行う方法は?
基本的に、次のようなクエリから情報を取得する方法について:select c.id,c.name from Category c
?
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();
結果を_List<Object[]>
_にするのは、.list()
関数自体の使用ではありません。 HQLクエリのフィールド(_c.id, c.name
_)の仕様です。クエリが
_ "select c from Category c"
_
次に、query.list()
は_List<Category>
_オブジェクトを返します。
クラスに直接マップすることもできます
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='[email protected]'";
Query query = sessionFactory.getCurrentSession().createQuery(queryString);
query.setResultTransformer(Transformers.aliasToBean(UserData.class));
return query.uniqueResult();
}