2016-08-30 3 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; 
    } 
} 

} 

것은 내가이 같은 쿼리 내 열 값을 사용할 것입니다 :

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(); 

이 검색어를 사용하면 색상 필드가 분홍색이나 빨간색 인 모든 기록을 REDISH으로 선택하고 싶습니다.

가능합니까?

답변

1

귀하의 변환기가 원하는대로하고 있다고 생각하지 않습니다. 첫째, JPA에 따라 유효한 AttributeConverter조차되지 않을 것이라는 점을 깨달으십시오. JPA는 기본 유형에 대한 AttributeConverters에 대한 지원 만 정의하며 String[]은 기본 유형으로 간주하지 않습니다. 그리고 Hibernate는 String[]을 허용하지만, Serializable로만 볼 수 있습니다.

String[]을 DB ARRAY에 저장하기 위해 저장할 예정입니까? 그렇다면, Hibernate는 DB ARRAY 타입을 지원하지 않는다 (아직 우리는 6.0에서 그것들에 대한 지원을 추가하고있다).

그러나 정확한 질문에 대답 ... 예, JPA는 AttributeConverter은 3.8 절에 설명 된대로 자동으로 특정 가이드 라인 내에서 쿼리에 적용한다고 말한다 : ... 지속성 공급자가해야

쿼리 실행을 위해 데이터베이스에 보내기 전에 Java Persistence 쿼리 언어 쿼리 또는 기준 쿼리 (예 : 비교, 대량 업데이트 등) 내에서 사용되는 경로 식의 특성 값 인스턴스에 모든 변환 방법을 적용합니다 ( ). 그러한 변환 된 속성이 리터럴 또는 매개 변수와의 비교 연산에 사용될 때 비교 대상인 리터럴 또는 매개 변수의 값도 변환해야합니다. ...

하지만 당신은 답장을 보내 <BINARY> in <BINARY>

+0

Tanx 같은 조건으로 끝낼 것입니다. String []에 대해 당신이 맞습니다. 그건 내 실수 였어. 오라클 조회를 사용하기 때문에 내 문제는 가치를 저장하는 것이 아닙니다. 'in'값으로 사용될 값 세트로 변환 할 유형의 매개 변수로 내 뷰를 조회하려고합니다. 마지막 성명을받지 못했습니다. –