1

従業員とプロジェクトの 2 つのエンティティ (テーブル) があります。従業員は複数のプロジェクトを持つことができます。Project テーブルの CREATOR_ID フィールドは、Employee テーブルの ID フィールドを参照します。Employee エンティティは Project の参照を保持していませんが、Project エンティティには Employee の参照があります。

EntityManager 次のクエリを使用すると正常に動作します -

entityManager.createQuery(
    "select e from EmployeeDTO e, ProjectDTO p"
    + " where p.id = ?1 and p.creator.id=e.id");

しかし、LAZY アソシエーション関係があるため、エラーが発生します。

プロキシを初期化できませんでした - セッションがありません

Employee エンティティからプロジェクト情報にアクセスしようとすると。これは予想されることなので、以下に示すように、Hibernate のセッションを使用してクエリを作成しています。

Session session = HibernateUtil.getSessionFactory().openSession();
org.hibernate.Query q = session.createSQLQuery(
    "SELECT E FROM EMPLOYEE_TAB E, PROJECT_TAB P  WHERE P.ID = "
    + projectId + " AND P.CREATOR_ID = E.ID")
    .addEntity("EmployeeDTO ", EmployeeDTO.class)
    .addEntity("ProjectDTO", ProjectDTO.class);

しかし、次のようなエラーが表示されます。

そのような場合に正しい JOIN 構文を提案できる人はいますか? 私が使用する("SELECT * FROM EMPLOYEE_TAB E, ........")と、他のエラーが発生します:

java.lang.ClassCastException: [Ljava.lang.Object; com.im.server.dto.EmployeeDTO にキャストできません

.

前もって感謝します。

4

2 に答える 2

1

ProjectDTOを読み込むときにネイティブ SQL クエリを使用して をプリフェッチする必要はありませんEmployeeDTO。元のクエリは、次のように、より洗練された方法で書き直すことができます。

select e from EmployeeDTO e join e.projects p where p.id = ?1

join fetch次に、プロジェクトをプリフェッチするために句を追加できます。

select distinct e from EmployeeDTO e join e.projects p join fetch e.projects where p.id = ?1

以下も参照してください。

于 2011-01-14T19:48:56.390 に答える
0

あなたの SQL は で始まりSELECT E from EMPLOYEE E ...ますSELECT E.*, P.* from EMPLOYEE E ...

于 2011-01-14T19:43:13.710 に答える