2016-08-30 2 views
3

Ich habe eine JPA-Entität wie folgt aus:Funktioniert jpa AttributeConverter in der Abfrageklausel?

@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; 

} 

Und mein ColorConverter ist wie folgt:

@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; 
    } 
} 

} 

Die Sache ist, dass ich so meine Spalte Wert in einer Abfrage verwenden möchten:

Expression<String> colorPath = root.get("color"); 
Predicate predicate = requestStatePath.in(Color.REDISH); 
Predicate[] predicatesArr = predicates.toArray(new Predicate[predicates.size()]); 
criteriaQuery.where(predicatesArr); 
CriteriaQuery<RectangleEntity> criteriaQuery = criteriaBuilder.createQuery(RectangleEntity.class); 
TypedQuery<RectangleEntity> query = this.em.createQuery(criteriaQuery); 
query.getResultList(); 

Ich möchte diese Abfrage wählen Sie alle meine Datensätze, deren Farbe Feld ist rosa oder rot, wie sie sind REDISH.

Ist es möglich?

Antwort

1

Ich glaube nicht, dass Ihr Konverter tut, was Sie tun wollen. Stellen Sie zunächst fest, dass dies laut JPA nicht einmal ein gültiger AttributeConverter sein würde. JPA definiert nur Unterstützung für AttributeConverters für Basistypen und berücksichtigt keinen String[] Basistyp. Und während Hibernate die String[] ermöglicht, wird es nur als Serializable angezeigt.

Erwarten Sie zu speichern, um diese String[] s in einem DB ARRAY zu speichern? Wenn dies der Fall ist, unterstützt Hibernate keine DB ARRAY-Typen (wir haben bereits darüber gesprochen, sie in 6.0 zu unterstützen).

Aber Ihre genaue Frage zu beantworten ... ja, sagt JPA, dass die AttributeConverter sollten automatisch in der Abfrage innerhalb bestimmter Richtlinien angewandt werden, wie 3.8 im Abschnitt:

... Die Persistenz-Provider muss Wenden Sie alle Konvertierungsmethoden auf Instanzen von Attributwerten in Pfadausdrücken an, die in Java Persistence-Abfragesprachenabfragen oder Kriterienabfragen (z. B. in Vergleichen, Bulk-Aktualisierungen usw.) vor dem Senden an die Datenbank für die Abfrageabfrage verwendet werden. Wenn solche konvertierten Attribute in Vergleichsoperationen mit Literalen oder Parametern verwendet werden, muss auch der Wert des Literals oder des Parameters, mit dem sie verglichen werden, konvertiert werden. ...

Aber Sie würden mit einem Prädikat wie <BINARY> in <BINARY>

+0

Tanx für Ihre Antwort am Ende. Sie haben Recht mit String []. Das war mein Fehler. Mein Problem besteht nicht darin, den Wert zu speichern, da ich Oracle View verwende. Ich möchte meine Ansicht mit Parameter eines Typs abfragen, der in eine Menge von Werten umgewandelt wird, die als ein 'in'-Wert verwendet werden. Ich habe deine letzte Aussage nicht bekommen. –

Verwandte Themen