문제

SQL에서는 다음과 같이 사람의 이름을 검색하는 쿼리를 작성할 수 있습니다.

SELECT * FROM Person P WHERE P.Name LIKE N'%ike%'

이 쿼리는 유니코드 문자로 실행됩니다(이름 열과 데이터베이스가 유니코드 지원을 처리하도록 설정되었다고 가정).

Hibernate(NHibernate)에 의해 실행되는 HQL에도 비슷한 쿼리가 있습니다.생성된 쿼리는 다음과 같습니다.

SELECT P FROM SumTotal.TP.Models.Party.Person P join P.Demographics PD WHERE (PD.LastName LIKE '%カタカ%'  )

불행하게도 HQL의 리터럴 앞에 'N'을 배치하면 오류가 발생합니다.문자열에서 유니코드 문자를 이스케이프 처리하려고 시도했지만 여전히 성공하지 못했습니다.

데이터베이스는 Hibernate로부터 유니코드 문자를 받아들이고 저장하고 있습니다.나는 유니코드 문자열로 객체를 성공적으로 채우고, 이를 Hibernate로 저장하고, 데이터베이스에서 확인할 수 있었습니다.사용자 지정 쿼리에서 유니코드 문자열을 사용할 수 없다는 것이 조금 이상하게 보입니다(또는 명명된 쿼리도 가정하고 있습니다).

이것이 Hibernate(Nhibernate)의 알려진 문제 또는 제한사항입니까?HQL에서 유니코드를 어떻게 사용하나요?

여러 사이트에서는 기준 쿼리 사용을 제안합니다.제가 작업 중인 프레임워크의 제약으로 인해 이는 불가능합니다.

도움이 되었습니까?

해결책

매개 변수로 시도 했습니까?

IList<Person> people = session
    .CreateQuery("from Person p where p.Name like :name")
    .SetParameter("name", "%カタカ%")
    .List<Person>();

또한 SQL 주입로부터 쿼리를 보호 할 수있는 이점이 있습니다.

다른 팁

작동하는 솔루션을 찾았습니다.나는 그것이 최선의 해결책인지 의심합니다.그러나 이는 제가 작업 중인 소프트웨어의 전체 쿼리 작성 섹션에 대한 재작성을 승인할 수 있을 때까지 구현할 솔루션입니다.

이 경우:

SELECT P FROM SumTotal.TP.Models.Party.Person P join P.Demographics PD WHERE (PD.LastName LIKE '%カタカ%')

where 절에는 다음 리터럴이 포함됩니다.

'%カタカ%'

이 리터럴은 Hibernate(Nhibernate)가 자신도 모르게 생성하는 SQL에 전달하는 nchars로 분할될 수 있습니다.이상하지만 작동합니다.따라서 이전 쿼리는 다음과 같이 작성될 수 있습니다.

SELECT P FROM SumTotal.TP.Models.Party.Person P join P.Demographics PD WHERE (PD.LastName LIKE '%' + nchar(0x30AB) + nchar(0x30BF) + nchar(0x30AB)+ '%')

이 솔루션은 각 문자를 살펴보고 그것이 멀티바이트 문자인지 확인해야 하므로 최적과는 거리가 멀습니다.그러나 이 코드가 앱에 있는 경우에는 다양한 작업에서 다양한 기준을 처리하는 동적 쿼리 생성기에 사용됩니다.제가 제시한 예에서는 문자열의 어느 곳에서나 유니코드를 찾고 있습니다.이 함수는 특정 숫자 값과 동일한 열에 대한 where 절 부분을 반환하거나 문자열의 시작 문자를 찾을 수 있습니다.연산자를 작성하는 방법은 연산자 유형과 용어를 사용하여 문자열을 반환합니다.나는 그것을 다시 쓸 수 있지만 그것은 큰 작업이 될 것입니다.위의 수정 사항을 사용하면 이 메서드에 전달된 문자열을 처리할 수 있습니다.나는 이 솔루션이 효과가 있기 때문에 제안하지만 Darin의 대답은 아마도 내가 찾을 수 있는 가장 좋은 방법일 것입니다.

이 문제는 nhibernate가 유형 길이없이 열에 액세스하려고 시도하기 때문에 발생합니다. 따라서 HBM.XML에서 레거시 데이터베이스의 길이를 언급하는 것이 매우 중요합니다. 그렇지 않으면 유니 코드 관련 제품에 실패합니다.

감사합니다, 타니

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top