nhibernate - nonnull - objective c optional property
어떻게 C#nullable 값 형식화 된 값을 NHibernate IQuery 매개 변수를 설정하면 설정할 수 있습니까? (2)
NHibernate를 사용하고 명명 된 쿼리를 통해 저장 프로 시저를 호출합니다.
<sql-query name="SearchStuff" read-only="true" cacheable="true">
<return class="ResultEntity" />
EXEC [SearchStuff] ?, ?, ? </sql-query>
저장 프로 시저 매개 변수 중 상당수는 의도적으로 nullable입니다. 변경할 수 없습니다.
C # :
IQuery listQuery = this.Session.GetNamedQuery("SearchStuff");
listQuery.SetInt32(0, param1);
listQuery.SetDateTime(1, param2);
listQuery.SetString(2, param3);
IList<ResultEntity> results = listQuery.List<ResultEntity>();
불행히도, NHibernate는 nullable 값 타입을위한 SetXyz () 메소드를 제공하지 않으므로 보상을위한 확장 메소드를 추가하려고 시도했다.
public static class QueryExtensions
{
public static void SetInt32(this IQuery query, int position, int? val)
{
if (val.HasValue)
{
query.SetInt32(position, val.Value);
}
else
{
query.SetParameter(position, null);
}
}
public static void SetInt32(this IQuery query, string name, int? val)
{
if (val.HasValue)
{
query.SetInt32(name, val.Value);
}
else
{
query.SetParameter(name, null);
}
}
public static void SetDateTime(this IQuery query, int position, DateTime? val)
{
if (val.HasValue)
{
query.SetDateTime(position, val.Value);
}
else
{
query.SetParameter(position, null);
}
}
public static void SetDateTime(this IQuery query, string name, DateTime? val)
{
if (val.HasValue)
{
query.SetDateTime(name, val.Value);
}
else
{
query.SetParameter(name, null);
}
}
}
나는 이들의 다양한 버전을 시도했지만 아무도 작동하지 않습니다. 위의 코드는 다음 오류와 함께 실패합니다.
System.ArgumentNullException : A type specific Set(position, val) should be called because the Type can not be guessed from a null value.
나는 또한 단순히 매개 변수를 설정하지 않으려 고 노력했지만 NHibernate는 모든 매개 변수를 설정해야합니다. 위치와 이름이 같은 버전을 동일한 결과로 사용하여 시도했습니다.
NHibernate 명명 된 쿼리 값을 입력 된 매개 변수에 null 값을 할당 할 수있는 방법이 있습니까?
그것을 달성하는 또 다른 방법은 다음과 같습니다.
query.SetParameter<int?>(0, null);
query.SetParameter<DateTime?>(1, null);
...
등등...
알았어 ?
원시 형을 null 가능하게하는 심볼.
자, 유형을 명시 적으로 설정할 수있는 SetParameter에 대한 몇 가지 재정의가 있습니다. 예 :
query.SetParameter(position, null, NHibernateUtil.Int32);
전체 확장 메서드 (Int32 및 DateTime 전용)는 이제 다음과 같습니다.
public static class QueryExtensions
{
public static void SetInt32(this IQuery query, int position, int? val)
{
if (val.HasValue)
{
query.SetInt32(position, val.Value);
}
else
{
query.SetParameter(position, null, NHibernateUtil.Int32);
}
}
public static void SetInt32(this IQuery query, string name, int? val)
{
if (val.HasValue)
{
query.SetInt32(name, val.Value);
}
else
{
query.SetParameter(name, null, NHibernateUtil.Int32);
}
}
public static void SetDateTime(this IQuery query, int position, DateTime? val)
{
if (val.HasValue)
{
query.SetDateTime(position, val.Value);
}
else
{
query.SetParameter(position, null, NHibernateUtil.DateTime);
}
}
public static void SetDateTime(this IQuery query, string name, DateTime? val)
{
if (val.HasValue)
{
query.SetDateTime(name, val.Value);
}
else
{
query.SetParameter(name, null, NHibernateUtil.DateTime);
}
}
}