2013-03-11 20 views
5

createQuery()の後にHibernate(HQL)のlist()を使用すると、キャストList<Object[]>List<POJO class>に直接入力します。私は実際のシナリオをここで説明します。私は3つの平易な古いJavaオブジェクトにPerson、Operation、Projectと言い、TableはPerson、Operation、Projectへの外部参照とのトランザクションを表します。Hibernate HQL createQuery()list()型を直接モデルにキャスト

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クエリ言語のクエリは 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(); 

それは、オブジェクトが[] POP_Modelに変換することはできませんと言って型キャストエラーが発生します。私はTypedQueryをチェックアウトしましたが、そのための例はありませんでした。しかし、私が知る限り、TypedQueryを使用してモデルではなくPOJOにマップすることができます。モデルにキャストを直接入力したい

+0

問題をよりよく解決する方法の1つは、基準APIに切り替えることです。 –

+0

「基準Api」は?そのリンクを参照することはできますか? – Misha

答えて

6

あなたはこのために代わりにHibernateのAPIの(Hibernateが同様に実装)JPAのAPIを使用したとOKであれば、あなたは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は異なる永続性librarieで作業を統一する、Java EEの標準ですHibernateとEclipseLinkのようなものです。 oracle tutorialはかなりまともです。

あなたは、このような非EEアプリケーションでEntityManagerを取得することができます。

@PersistenceUnit 
    private EntityManagerFactory emf; 
    ... 
    EntityManager em = emf.createEntityManager(); 
+0

私はJPA APIをはじめて訪れました。 JPAの例のよいリンクを教えてください。私はStruts 2 Applicationを使用しています。次に、どのようにしてentityManagerオブジェクトを取得できますか? – Misha

+0

@Misha - いくつかのdetialsを追加しました、それがあなたをさらに助けることを願っています。 IMOでは、新しいAPIを学ぶことができず、ハイバーネイトがネイティブにこの機能を提供しているので、後でJPAを念頭に置いて休止状態のバージョンに移行します。 – kostja

+0

@@ kostja:ありがとう、トン。私はsession.createQuery()を使用して正常に動作します.. – Misha

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 

を使用することができ、ここでofficial documentationです。 New object with HQLも参照してください。

関連する問題