You could look at query.substitutions in the NHibernate configuration

      <property name="query.substitutions">true 1, false 0, yes 'Y', no
'N'</property>

John Davidson

On Tue, Sep 14, 2010 at 10:31 PM, Schotime <[email protected]> wrote:

> I'm trying to use the alias to bean method to map custom sql into a
> dto, but because I want to map from a column that has 1's and 0's to a
> boolean it fails.
> I have implemented my own one and it seems to work. Is there a better
> way?
>
> [Serializable]
>        public class MyAliasToBeanResultTransformer :
> IResultTransformer
>        {
>            private const BindingFlags flags = BindingFlags.Public |
> BindingFlags.NonPublic | BindingFlags.Instance;
>            private readonly System.Type resultClass;
>            private object[] setters;
>            private readonly IPropertyAccessor propertyAccessor;
>            private readonly ConstructorInfo constructor;
>
>            public MyAliasToBeanResultTransformer(System.Type
> resultClass)
>            {
>                if (resultClass == null)
>                {
>                    throw new ArgumentNullException("resultClass");
>                }
>                this.resultClass = resultClass;
>
>                constructor = resultClass.GetConstructor(flags, null,
> System.Type.EmptyTypes, null);
>
>                // if resultClass is a ValueType (struct),
> GetConstructor will return null...
>                // in that case, we'll use Activator.CreateInstance
> instead of the ConstructorInfo to create instances
>                if (constructor == null && resultClass.IsClass)
>                {
>                    throw new ArgumentException("The target class of a
> AliasToBeanResultTransformer need a parameter-less constructor",
>                                                "resultClass");
>                }
>
>                propertyAccessor =
>                    new ChainedPropertyAccessor(new[]
>                                                                {
>
> PropertyAccessorFactory.GetPropertyAccessor(null),
>
> PropertyAccessorFactory.GetPropertyAccessor("field")
>                                                                });
>            }
>
>            public object TransformTuple(object[] tuple, String[]
> aliases)
>            {
>                object result;
>
>                try
>                {
>                    if (setters == null)
>                    {
>                        setters = new object[aliases.Length];
>                        for (int i = 0; i < aliases.Length; i++)
>                        {
>                            string alias = aliases[i];
>                            if (alias != null)
>                            {
>                                setters[i] = new object[]
>                                                 {
>
> propertyAccessor.GetSetter(resultClass, alias),
>
> propertyAccessor.GetGetter(resultClass, alias).ReturnType
>                                                 };
>                            };
>                        }
>                    }
>
>                    // if resultClass is not a class but a value type,
> we need to use Activator.CreateInstance
>                    result = resultClass.IsClass
>                                ? constructor.Invoke(null)
>                                :
>
> NHibernate.Cfg.Environment.BytecodeProvider.ObjectsFactory.CreateInstance(resultClass,
> true);
>
>                    for (int i = 0; i < aliases.Length; i++)
>                    {
>                        if (setters[i] != null)
>                        {
>                            var type = (Type)((object[]) setters[i])
> [1];
>                            var setter = (ISetter)((object[])
> setters[i])[0];
>                            if (!
> type.IsAssignableFrom(tuple[i].GetType()))
>                                setter.Set(result,
> Convert.ChangeType(tuple[i], type));
>                            else
>                                setter.Set(result, tuple[i]);
>                        }
>                    }
>                }
>                catch (InstantiationException e)
>                {
>                    throw new HibernateException("Could not
> instantiate result class: " + resultClass.FullName, e);
>                }
>                catch (MethodAccessException e)
>                {
>                    throw new HibernateException("Could not
> instantiate result class: " + resultClass.FullName, e);
>                }
>
>                return result;
>            }
>
>            public IList TransformList(IList collection)
>            {
>                return collection;
>            }
>        }
>
> --
> You received this message because you are subscribed to the Google Groups
> "nhusers" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected]<nhusers%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/nhusers?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en.

Reply via email to