2012-05-22 3 views
0

는 여기에 내가 일하고 시나리오입니다 : 지금 우리가 같이 읽는 SQL 문이 :NHIbernate ICriteria를 사용하여 일부 필드를 숨기는 방법은 무엇입니까?

SELECT a.ID,a.MsgNumber,CASE WHEN @HasAccess=1 THEN Title ELSE '*********' END AS Title FROM Messages 

우리는 운영자가 메시지가 시스템에 등록하면 볼 수 있지만 볼 수없는 것을 원하는 제목이 승인되지 않은 경우

나는이 코드 부분을 변경하여 NHibernate 기준을 사용하여 동일한 결과를 생성하므로 사용자가 선택하는 필터에 따라 동적 쿼리를 생성 할 수 있습니다. 나는 투영법을 사용하여 기준에서 일부 필드 또는 상수 값을 얻을 수는 있지만 내가 원하는 것을하기 위해 어떻게 결합해야 하는지를 알 수는 없다는 것을 알고 있습니다.

답변

1

@HasAccess는 데이터베이스에서 결정한 값이 아니라 코드에서 전달한 매개 변수입니다. , 당신이 원하는 것을 할 수있는 다음 가장 쉬운 방법은 쿼리에 통과 할 값에 따라 코드의 기준을 수정하는 것입니다 그렇다면 예 : 그러나 @HasAccess는 데이터베이스에서

var projections = Projections.ProjectionList() 
     .Add(Projections.Id()) 
     .Add(Projections.Property("MsgNumber")) 
     .Add(hasAccess ? Projections.Property("Title") : Projections.Constant("*********")); 

var criteria = session.CreateCriteria<Message>() 
     .Add(... your restrictions ...) 
     .SetProjection(projections) 
     .List<object[]>(); 

를 판단되는 경우 어떻게 든, 당신은 사용할 수 있습니다

Projections.Conditional(Restrictions.Eq("HasAccess", 1), 
    Projections.Property("Title"), 
    Projections.Constant("*********")) 

당신이 내가 묻고 싶은는 job.Here의 질문을 할 것입니다 생각 대답을 어떻게 든 당신의 기준에

+0

감사를 HasAccess를 얻을 수 있다고 가정 : 어떻게 투영의 별칭을 설정할 수 있습니까? 나는 Projections.Property ("Title") : Projections.Constant ("*********"));를 원한다는 것을 의미한다. 어쨌든 별칭 제목이 있으므로 Transformers.AliasToBean을 사용하여 유형을 채울 수 있습니다. – Beatles1692

+0

Projections.Constant ("*** ..."). As ("Title") –