私はEJB、JPAを学んでいて、非常に基本的な疑問があります
私は3つのテーブルA、B、Cを持っています
A - ID、名前
B - ID、名前
C - ID、A_ID、B_ID
データベースからエンティティ クラスを作成すると、JPA を含む 3 つの EJB クラスが取得されます。
マネージド Bean で A.Name または B.Name を取得し、C を使用して一致するエントリを見つける必要があります。
通常の SQL クエリは次のようになります (最適なクエリではない可能性があります)
SELECT a.name FROM schema.A a, schema.B b, schema.C c where b.Name='ABC' and c.B_ID=b.ID and a.ID = c.A_ID;
さて、クラスのどこで上記のクエリを実行しますか。
@SecondaryTable に出くわしましたが、その使用方法を正確に理解できませんでした。
em.createQuery( SQL query).getResultList() も見ました。
上記が最善の方法です。または、EJB/JPA で利用できるより優れた方法があります。
更新 1:
em.CreateQuery でクエリを実行しようとしていました
em.CreateQuery(SELECT a.name FROM A a, B b, C c where b.Name='ABC' and c.B_ID=b.ID and a.ID = c.A_ID).getResultList();
しかし、GlassFishサーバーで次のエラーが発生します(EclipeLink JPAを使用しています)
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERROR: syntax error at or near ")"
Position:
Error Code: 0
Call: SELECT t0.given_name FROM test.a t3, test.a_b t2, test.b t1, test.a t0 WHERE ((((t1.Name = ?) AND (t2.b_id = t1.id.t1.id)) AND (t0.id = )) AND (t3.id = t2.a_id))
bind => [1 parameter bound]
Query: ReportQuery(referenceClass=Consultant sql="SELECT t0.given_name FROM test.a t3, test.a_b t2, test.b t1, test.a t0 WHERE ((((t1.Name = ?) AND (t2.b_id = t1.id.t1.id)) AND (t0.id = )) AND (t3.id = t2.a_id))")
SQL ステートメントがエラー ログでめちゃくちゃになっているのはなぜですか
1.追加のエントリーテストがあります.a t0
2.t2.b_id = t1.id.t1.id
3.t0.id=
エラー ログの SQL ステートメントはどのように生成されますか。