2010-07-30 1 views
3

데이터베이스에서 결과 목록을 선택하고 싶지만 JDO 쿼리의 연산자 ==은 대소 문자를 구분합니다. 단일 매개 변수를 사용하여 테이블에서 "사용자", "사용자"및 "사용자"를 선택하는 방법이 있습니까?JDO 쿼리에서 대소 문자 차이 무시

MySQL에는 LIKE 연산자가 있고 Java에는 equalsIgnoreCase 함수가 있습니다. 그러나이 예제에서는 둘 다 작동하지 않습니다.

PersistenceManager pm = JDO.factory.getPersistenceManager(); 

Query query = pm.newQuery(User.class, "username == usernameParam"); 
query.declareParameters("String usernameParam"); 

List<User> results = (List<User>) query.execute(username); 

답변

4

JDOQL에는 사용할 수있는 몇 가지 String 메소드가 있습니다. 설명서 here을 확인하십시오.

PersistenceManager pm = JDO.factory.getPersistenceManager(); 

Query query = pm.newQuery(User.class, "username.toUpperCase() == usernameParam"); 
query.declareParameters("String usernameParam"); 

List<User> results = (List<User>) query.execute(username.toUpperCase()); 
+0

응용 프로그램 엔진에서이 기능에 대해 "지원되지 않는 데이터 저장소 기능"이 표시됩니다. – JohnIdol

5

당신은 대소 문자를 구분 방식으로 필드의 사본을 저장해야 - 낮은 경우를 예를 들어, '정렬의 경우'가 가능한 경우 더 있지만. 그런 다음 쿼리하십시오.

이유는 '대소 문자를 구분하지 않는 방식'으로 일반 색인을 효율적으로 검색 할 수 없기 때문입니다.

+0

와우는 정말 :

다음 작업을 수행 할 수있는 문제를 해결하려면? 비효율적이고 오류가 발생하기 쉬운 솔루션처럼 들립니다. http://www.jpox.org/docs/1_2/jdo/jdoql_methods.html에서 toLowerCase() 메소드를 발견했기 때문에 toLowerCase (username) == toLowerCase (usernameParam)를 쿼리 할 수 ​​있습니다. 이것은 약간 비효율적이며 매우 우아하지는 않지만, 효과가있을 수 있습니다. – Vortico

+2

그것은 비효율적 인 것과 정반대입니다. 질문에서 언급 한 접근법 중 하나가 수행하는 것 인 데이터베이스의 모든 항목을 쿼리와 비교하는 것은 비효율적입니다. 필드의 toLowerCase()는 같은 이유로 작동하지 않습니다. –

+0

즉, 대/소문자를 구분하지 않는 방법으로 검색 할 수있는 텍스트를 대/소문자 구분 방식으로 저장해야한다면 app-engine에서 현재 유일한 방법은 다른 필드를 만들고 주어진 텍스트 인 .toLowerCase를 복제하는 것입니다. – JohnIdol