2016-08-30 5 views
3

私はこのようなJPAエンティティを持っている:jpa AttributeConverterはクエリ節に適用されますか?

@Entity 
public class RectangleEntity 
{ 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    @Column 
    private Integer x; 

    @Column 
    private Integer y; 

    @Column 
    @Convert(converter = ColorConverter.class) 
    private Color color; 

} 

そして、私のColorConverterはこのようなものです:

@Converter 
public class ColorConverter implements AttributeConverter<Color, String[]> { 

@Override 
public String[] convertToDatabaseColumn(Color color) { 
    switch(color) { 
     case REDISH : return {"red","pink"}; 
     case GREENISH: return {"green","cyan"}; 
    } 
    return sb.toString(); 
} 

@Override 
public Color convertToEntityAttribute(String... colorStrings) { 

    if(colorStrings == null || colorStrings.length != 1) { 
    return null; 
    } 
    if(colorStrings[0].equals("red") || colorStrings[0].equals("pink")) { 
    return REDISH; 
    } else if(colorStrings[0].equals("green") || colorStrings[0].equals("cyan")) { 
    return GREENISH; 
    } 
} 

} 

事は、私はこのようなクエリでは、私の列の値を使用したいということです。

このクエリでは、色フィールドがピンクまたはレッドのすべてのレコードを選択します。REDISHです。

可能でしょうか?

答えて

1

私はあなたのコンバーターがあなたがしたいことをやっているとは思わない。まず、JPAによると、それが有効なAttributeConverterではないことを認識してください。 JPAは、基本タイプでAttributeConvertersのサポートを定義するだけで、String[]は基本タイプとはみなされません。また、HibernateはString[]を許可していますが、それはシリアライズ可能としか見えません。

String[]をDB ARRAYに保存することを想定していますか?もしそうなら、HibernateはDB ARRAY型をサポートしていません(しかし、我々は6.0でそれらのサポートを追加することについて話しています)。持続性プロバイダが...

しなければならない:はい、JPAはAttributeConverterは、セクション3.8に概説されているように自動的に一定のガイドライン内のクエリに適用されるべきであると述べている

しかし、あなたの正確な質問に答えるために... クエリ実行のためにデータベースに送信する前に、Java Persistenceクエリ言語クエリまたは 条件クエリ(比較、一括更新など)内で使用されるパス式の属性値のインスタンスに変換方法を適用します( )。そのような変換された属性が、リテラルまたは のパラメーターとの比較操作で使用される場合、それらが比較されるリテラルまたはパラメーターの値も変換されなければなりません。 ...

しかし、あなたはあなたの返事のため<BINARY> in <BINARY>

+0

たTaNxのような述語で終わるだろう。 あなたはString []について正しいです。それは私の間違いでした。 私の問題は、Oracleビューを使用しているために値を格納することではありません。 'in'値として使用される一連の値に変換される型のパラメータで私のビューを照会したいと思います。 私はあなたの最後の声明を受け取りませんでした。 –

関連する問題