2011-09-09 4 views
1

Oracle에서 Fluent NHibernate를 사용하고 있는데 문제는 어디에서든 모든 문자열에 lower() 함수를 적용해야한다는 것입니다. 나는 대신 Oracle 하위 함수가 nls_lower를 사용하고 있음을 알리는 내 자신의 방언을 만들었습니다. 데이터베이스는 Microsoft Dynamics AX에서 주로 사용되며이 기능은 성능을 향상시킵니다. 이와 같은 표준 쿼리에서 모든 것이 제대로 작동합니다.NHibernate에서 참조로 SQL 함수를 사용하는 방법?

session.QueryOver<User>() 
    .Where(x => x.Name.lower() == userName.lower()) 
    .SingleOrDefualt<User>(); 

그러나이 lower() 함수를 참조에 어떻게 적용 할 수 있습니까? 나는 이것을 위해 적당한 것을 발견 할 수 없다. 그리고 나는 그것이 어떻게 든 끝날 수 있다고 기대한다. 나는 매핑 클래스에서이 같은 것을 기대하지만 난 그것을 찾을 수 없습니다 :

References<Settings>(x => x.Settings) 
    .Column("SettingId").lower(); 

나는 소문자로 즉시 내 문자열을 변환하고 싶지 않아하지만 난 정말이 같은 쿼리를 생성해야합니다

select * from User where nls_lower(Name) == nls_lower("somename"); 

감사합니다.

답변

0

당신은 개체를로드하는 사용자 정의 SQL을 정의 할 수 있습니다 : 당신이 당신의 방언 확장이 방법으로 호출 할 수 있어야 등록했습니다

. here을 참조하십시오.

1

nls_lower은 오라클 사투리에 등록 된 기능이 아닙니다.
Oracle8iDialect 클래스의 코드 기반을 살펴볼 수 있습니다. 이 경우 자신의 내선 번호를 등록해야합니다. 보십시오 here.

var filter1 = Restrictions.Eq(
    Projections.SqlFunction("nls_lower", NHibernateUtil.String, 
    Projections.Property<User>(x => x.Name)), userName.ToLower()); 

var user = session.QueryOver<User>(); 
user.Where(myFilter) 
    .SingleOrDefualt<User>(); 
+0

등록 된 기능이 아닙니다. 마찬가지로 나는이 함수를 등록하고 표준 하위 함수를 재정의하는 Oracle10gDialect의 하위 클래스를 만들었다 고 말했다. 이것은 표준 쿼리에서 작동합니다. 질문은 참조에서 생성 된 쿼리에 대해 SQL 함수 (이 경우 nls_lower)를 사용하는 방법입니다. – oFce

+0

@oFce : 늦게 회신하여 죄송합니다. 내 대답은 QueryOver에서 사용할 수있는 방법을 보여주었습니다. 해보지는 않았지만 효과가있다. – LeftyX

+0

응답 해 주셔서 감사합니다. 그러면 특성 Name에 대해서만 nls_lower를 적용합니다. 나는 모든 문자열 속성을 원한다. 예를 들어 엔티티 User를 참조하는 Settings 엔티티가 있습니다. 이 2에 대해 엔티티 사용자 및 엔티티 설정에 대해 사용자의 ID로 제한된 SQL 쿼리가 생성됩니다. 엔티티 설정의 조건에 nls_lower를 적용하고 싶습니다. – oFce

관련 문제