2017-01-24 3 views
4

CreditcardNumb.class에 신용 카드 번호가 유효한지 확인하는 생성자가 있다고 가정합니다.Criteria API 호출 중에 (로컬로) AttributeConverter를 우회하거나 사용 불가능하게하는 방법이 있습니까?

나는 다음 데이터베이스에서 문자열로 신용 카드 번호를 변환하는 CreditcardNumbConverter.class를 만들 :이 작품을 좋아

public class CreditcardnumbConverter 
     implements AttributeConverter<CreditcardNumb, String> { 

    public String convertToDatabaseColumn(CreditcardNumb cn) { 
     if (cn== null) return null; 
     return cn.toString(); 
     } 

    public CreditcardNumb convertToEntityAttribute(String cn) { 
     if ((cn == null) || cn.trim().isEmpty()) return null; 
     return new CreditcardNumb(cn); 
     } 
    } 

,하지만 지금은 사용할 Hibernate의 기준 API (새로운 또는 기존의 API를) "123"로 시작하는 신용 ​​카드 번호를 검색 : 그러나

CreditcardNumb cn = new CreditcardNumb("123"); 

createCriteria(Wallet.class) 
     .add(Restrictions.ilike("creditcard", cn, MatchMode.START)) 
     .list(); 

을 "123"유효한 신용 카드 번호가 아닙니다 때문에, 객체 인스턴스화가 실패합니다. 또한 ilike 메서드는 이 아닌 String을 허용하기 때문에 컴파일되지 않습니다.

내 질문 : 나는 같은 것을 할 수 있도록

는, (로컬) 우회 또는 전환을 해제에 대한 방법 있습니까 :

createCriteria(Wallet.class) 
     .disable(CreditcardnumbConverter.class)) 
     .add(Restrictions.ilike("creditcard", "123", MatchMode.START)) 
     .list(); 

을 또는 어떤 다른 방법이 Criteria API (HQL을 사용하지 않음)를 사용하여 "123"으로 시작하는 신용 ​​카드 번호를 검색하십시오.

@Entity 
public class Wallet { 

    private CreditcardNumb creditcard; 

    @Column(name = ..., insertable = false, updatable = false) 
    private String creditcardStr; 

    ... 
} 

중요한 점은 그 값이 (그렇지 않으면 최대 절전 모드 지속되지 않도록 삽입하거나 업데이트 할 수도있는 것으로이 열을 매핑하는 것입니다

+0

없음 방법. 귀하의 유효성 확인에 대해 다시 생각해보십시오. 개인적으로 나는 생성자 내부에서 유효성 검사를하는 것을 선호하지 않습니다. 컴파일러는 무엇보다 먼저 생성자를 찾습니다. 그래서 당신은 오류가 발생했습니다. –

+1

생성자에서 유효성 검사가 마음에 들지 않습니까? 미안하지만 불법 국가에 물건을 갖고 싶지 않습니다. 합법적 인 신용 카드 번호 만 갖고 싶지만 Criteria API를 사용하여 검색 할 수 있습니다. – MarcG

답변

2

당신은 String 유형의 다른 속성에 신용 카드의 열을 매핑 할 수 있습니다 creditcard 또는 creditcardStr 값을 사용하여 기본 데이터베이스 열을 업데이트할지 여부는 알 수 없습니다.

이제 쿼리는 다음과 같이 할 수 있습니다

createCriteria(Wallet.class) 
    .add(Restrictions.ilike("creditcardStr", "123", MatchMode.START)) 
    .list(); 
+0

와우, 매우 창의적인 솔루션. 문제는 클래스에 여분의 필드가 있고 다른 과도한 복잡성을 추가하여 AttributeConverters의 목적을 무효화하는 것입니다. 이게 내가 AttributeConverters를 사용하는 것을 포기하거나 Hibernate 팀이 이것을 해결하기를 기다리는 동안 잠정적 인 해결책으로이 대답을 사용하는 유일한 방법이라면 : https://hibernate.atlassian.net/browse/HHH-11415 – MarcG

+0

앞으로 며칠 안에 다른 아이디어가 더 이상 나오지 않으면이 대답을 받아 들일 것입니다. – MarcG

+0

사실, 트레이드 오프가 있습니다. 개인적으로 나는 속성 변환기를 사용하지 않고 String으로 매핑하고, 변환을 수행하는'CreditcardNumb' getter와 setter를 생성합니다. 물론, 모든 쿼리에서 문자열 값을 매개 변수로 사용하도록주의해야합니다. –