6

createQuery() の後に Hibernate (HQL) の list() を使用する場合List<Object[]>、 my List<POJO class>. ここで実際のシナリオについて説明します。Person、Operation、および Project という 3 つの Plain Old Java オブジェクトと、Person、Operation、および Project への外部参照を含む Transaction というテーブルがあります。

class Person {
  String name;
  // getters and setters
}

class Operation {
  String name;
  // getters and setters
}

class Project {
  String name;
  // getters and setters
}

class Transaction {
  String p_id;
  String o_id;
  String project_id;
  // refers to id of All three table above
}

ここで、Hibernate Query Language クエリを実行したいと思います String query="select p.name, o.name, project.name from Person p , Operation o, Project project , Transaction t where p.id=2 and p.id=t.p_id and o.id=t.o_id and project.id=t.project_id"

このクエリの出力用に POP_Model という Model クラスを作成しました。

private class POP_Model {
  String person_name;
  String operation_name;
  String project_name;
}

ここで、Hibernate クエリを使用したいと思います。

Session session=HibernateConnection.getSessionFactory().openSession();
Query q=session.createQuery(query);
List<POP_Model> list=(List<POP_Model>)q.list();

Object[] を POP_Model に変換できないという typecast エラーが発生します。TypedQuery を調べましたが、その例はありませんでした。しかし、私が知る限り、TypedQuery は Model ではなく POJO にマップするために使用できます。モデルにキャストを直接入力したい。

4

2 に答える 2

8

これに Hibernate API の代わりに JPA API (Hibernate も実装) を使用しても問題ない場合は、JPQL コンストラクタークエリを使用できます。

List<DTO> dtos = entityManager.createQuery("SELECT NEW com.example.DTO( p.name, o.name) FROM Entity o").getResultList();

EDIT Hibernate は通常の API でコンストラクター式を実装しているようです。

List<DTO> dtos = session.createQuery("SELECT NEW com.example.DTO( p.name, o.name) FROM Entity o").list();

EDIT2 JPA は Java EE 標準であり、Hibernate や EclipseLink などのさまざまな永続ライブラリとの連携を統合します。オラクルのチュートリアルはかなりまともです。

次のように、非 EE アプリケーションで EntityManager を取得できます。

  @PersistenceUnit
  private EntityManagerFactory emf;
  ...
  EntityManager em = emf.createEntityManager();
于 2013-03-11T13:17:57.943 に答える
3

まず、POJO クラスにコンストラクターを作成します。

private class POP_Model {
  String person_name;
  String operation_name;
  String project_name;

  public POP_Model(String person_name, String operation_name, String project_name){
      this.person_name = person_name;
      this.operation_name = operation_name;
      this.project_name = project_name;
  }
}

次に、使用できます

select new com.server.dtos.POP_Model(p.name, o.name, project.name) 
from Transaction t INNER JOIN t.operation o
INNER JOIN t.person p 
INNER JOIN t.project project  
where p.id=2

参考までに、公式ドキュメントはこちらです。HQL で New objectも通過します。

于 2013-03-11T13:18:05.337 に答える