2016-03-19 4 views
0

これは問合せです。私はこれが変換するのに十分シンプルであることを願っています。私はJPA、特にJPQLの新機能です。このクエリを変換したかったのです。このjdbc問合せをJPA(JPQL)に変換する方法

select t1.field1, t1.field2, t1.field3 from TABLE_ONE t1, TABLE_TWO t2, TABLE_THREE t3 where t1.field2 = t2.field1 and t1.field3 = t3.field1 and t1.field1 = '123' 

私は...クラスTableTwoとTableThreeのための同じ

@Entity 
@Table(name="TABLE_ONE") 
public class TableOne { 
     @Column(name="field1") 
     private String field1; 

     @Column(name="field2") 
     private String field2; 

をエンティティオブジェクトを作成し始めています。

@OneToManyまたは@OneToOneタグを使用してJPQLでそのクエリを翻訳する必要がある場合、私は混乱します。その特定のクエリのためだけにそれらのタグを作成することは現実的ではないと思います。これは途中でJPA 2.0です

何か助けていただければ幸いです。ありがとうございました。

答えて

3

JPA 2.0 specification(11.1.6項)によると、あなたのように、タイプStringのクラス属性のため@OneToManyまたは@OneToOneアノテーションを使用する必要はありません。

基本注釈が最も単純なタイプですデータベース列へのマッピング。 Basic注釈 は、Javaプリミティブ 型、プリミティブ型のラッパー、java.lang.String、...、java.util.Date、java.util.Calendar、またはその他のタイプの永続プロパティまたはインスタンス変数に適用できます。 java.sql.Date、 java.sql.Time、java.sql.Timestamp、byte []、Byte []、char []、Character []、 enums、およびSerializableを実装するその他の型。

セクション2.8で説明したように、基本アノテーションの使用は、これらのタイプの永続フィールドとプロパティの場合は、のオプションのです。 Basic注釈 が指定されていない場合は、のデフォルト値が適用されます。

これは、JPA準拠のORM実装によって保証された動作です。さらに、@Columnアノテーションを使用すると、Stringクラス属性の永続性も指定されますが、特定の属性のデータベース固有のプロパティ(たとえば、フィールド長、名前、ヌル可能なものなど)にさらに明示的に影響を与えるために使用することができます(@Column)。 。

ネイティブJDBCクエリーの翻訳はそうのようなあなたのために働く必要があります

:変数jpqlConformQueryStringに、限られたとして指定されているよう

String jpqlConformQueryString = 
    "SELECT t1 from TableOne t1, TableTwo t2, TableThree t3 WHERE "+ 
    "t1.field2 = t2.field1 AND "+ 
    "t1.field3 = t3.field1 AND "+ 
    "t1.field1 = :field1"; 

// create a typed query to fetch only objects of that type 
TypedQuery<TableOne> query = em.createQuery(jpqlConformQueryString, TableOne.class); 

// set the value of the parameter "field1" to a value you choose... 
query.setParameter("field1", "123"); 

// retrieve objects (transformed tuples) matching previously defined and parameterized query 
List<TableOne> result = query.getResultList(); 

// process the result list further 
// ... 

この方法では、リスト「結果が」唯一の基準に一致するオブジェクトを参照しますt1.field1の明示的なパラメータで指定します。

メモ:を選択すると、単純なJDBCコードのような属性があります。代わりに、オブジェクト全体を選択し、各オブジェクトのgetter/setterメソッドを使用して、データベースから読み取られた値にアクセスまたは操作します。

+0

jdbcクエリに左/右ジョインがある場合はどうなりますか?それに対して私は同じことをすることができますか? –

+0

これは別の質問でしょう。新しいQを尋ね、私はベストを尽くす。 Btw:上記の答えはあなたの質問に対する解決策を提供しますか? – MWiesner

+0

私は仕事に戻るときに月曜日にそれを試してみてください。回答ありがとうございます。 –

関連する問題