2010-08-16 1 views
6

안녕하세요 여러분, NamedQuery를하는 동안 정확히 일치하는 문제가 있습니다.JAVA : NamedQuery 문자열 문제

나는 현재이 같은 것을 사용하고 있습니다 :

@NamedQuery(name = MyClass.GET_ENTRY_BY_NAME, query = "select e from Entry e where e.name =:"+ Entry.NAME) 

... 

Query query = em.createNamedQuery(MyClass.GET_ENTRY_BY_NAME); 
     query.setParameter(Entry.NAME, myEntry.getName()); 

그것은 대부분의 경우 작동하지만 나는 경우 사용자가 끝에 공백으로 파일 이름을 전달할 것으로 나타났습니다은 namedQuery는 문자를 무시합니다. 예 :

Query query = em.createNamedQuery(MyClass.GET_ENTRY_BY_NAME); 
     query.setParameter(Entry.NAME, myEntry.getName()+ " "); 

이전에 쿼리와 동일한 결과를 반환합니다. 내 '유효한 입력'검증을 우회합니다. 즉, 쿼리를 전혀 항목을 반환하고 나중에 오류를 처리하고 싶습니다. 내가 생각할 수있는

한 가지 해결 방법은이처럼 namedQuery 내 매개 변수를 둘러싼 작은 따옴표를 넣어하는 것입니다 내 코드를 쓰레기 것이다 그러나

@NamedQuery(name = MyClass.GET_ENTRY_BY_NAME, query = "select e from entry e where e.name =':"+ Entry.NAME "'") 

이 경우 문자열은 작은 따옴표가 들어 있습니다 .. .

어떤 아이디어가 있니?

답변

4

을 나는 JPA에서 어떤 연구를하고, 문자 트리밍 일부 자동한다는 것을 발견 I 이것이 Strings와 동일하게 동작하는지 확실하지 않지만 나에게 일어나고 있기 때문에 ... 나는 그렇게 믿는다. 이를 우회하는 유일한 방법은 세션 DatabaseLogin 객체 내의 일부 속성을 설정하는 것입니다 (http://www.eclipse.org/eclipselink/api/1.1/org/eclipse/persistence/sessions/DatabaseLogin.html#setShouldTrimStrings 참조).

글쎄 나는 세션 속성을 엉망으로 만들고 싶지 않아서 일종의 검사를하고 NoResultException catch가 내 코드에서하는 것과 같은 예외를 던지기로 결정했다.

query.setParameter(Entry.NAME, myEntry.getName()); 

... 

if(!StringUtils.equals(result.getName(), myEntry.getName()){ 
    do a cool throw just like NoResultException Catch 
} 

나는 또한 트림 기능 axtavt을 포함했다 :

나는 기본적으로 데이터베이스에서 결과를 가져다가 내가 사용하는 문자열로 필드를 비교! 이것은 데이터베이스에 후행 공백이있는 열이 있고 사용자가 지정한 매개 변수와 일치하는 경우 유효한 대답으로 포함되도록하는 것입니다. 예 :

데이터베이스 항목 : Name = "Flavio"- Function = "Flavio"로 트리밍됩니다.

전달 된 매개 변수 : 이름 = "Flavio"- JPA 자동 기능 = "Flavio"로 트리밍 됨.

전혀 트리밍되지 않으면 "Flavio"와 "Flavio"를 비교하여 NoResult가 해당 항목을 반환 할 때 반환합니다.

불쾌한 해결 방법이지만 자동 트리밍을 중지 할 다른 방법이없는 한 이러한 종류의 것들을 사용해야합니다.

다른 모든 답변 주셔서 감사합니다 !!

4

데이터베이스 필드가 CHAR(...)으로 선언되어 있으므로 저장 값에 = 조작으로 고려되지 않은 공백이 채워 졌기 때문에 이런 현상이 발생합니다.

그래서, 당신은 VARCHAR(...)로 데이터베이스 필드를 선언하거나 내장 trim 기능을 사용할 수 있습니다 중 하나

query = "select e from Entry e where trim(trailing from e.name) =:"+ Entry.NAME 
+0

안녕하세요 axtavt, 답장을 보내 주셔서 감사합니다. 음, 내 데이터베이스는 VARCHAR로 설정됩니다. 그러나 MySql 버전이이 문제와 관련이 있는지 확실하지 않습니다. 또한 쿼리의 매개 변수를 설정하기 전에 일부 작업을 수행하는 방법에 대해 생각했지만 사용자가 원하는 정보를 정확하게 입력하고 있는지 확인하기 위해 데이터베이스와 다른 오류를 반환하는 소프트웨어를 원했습니다. –

+0

@flavio : MySQL에 익숙하지 않아 기능에 대해 말할 수 없습니다. 또한 내 쿼리 샘플은 매개 변수가 아니라 저장된 값을 트림하므로 결과가 정확해야합니다. – axtavt

+0

Query를 빌드하는 과정을 검사하는 코드를 디버깅했습니다 ... 제공 한 코드를 사용하면 문제가 mySql 내에있는 것처럼 보입니다. 나는 매개 변수와 데이터베이스 항목이 다르다는 것을 알아 차렸다. 그러나 미지의 신비한 신성한 힘을 위해 MySql은 공백을 제거하고 정확히 일치하는 것으로 간주한다 ... 이제는 이것이 어떤 것인지 조사하기위한 연구가 필요하다고 생각한다. 실제로 MySql은 예상되는 동작이거나 그 뒤에 뭔가가 있습니다. 지금 나는 여분의 수표를 만들어야한다고 생각합니다. 감사! –