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);
        }
    }
}