I have created some new tests using NH 3, and I consistently get the
same behavior. When adding a restriction to a string property, NH
converts the string to a bit/int if it can. For example, this query:
IList<Employee> emps = _EmployeeDAO.GetSession()
.CreateCriteria<Employee>()
.Add(Restrictions.Eq("FirstName","true"))
.List<Employee>();
Results in this:
SELECT this_.ID as ID10_0_,
this_.LastName as LastName10_0_,
this_.FirstName as FirstName10_0_,
FROM Employee this_
WHERE this_.FirstName = 1 /* @p0 */
On Aug 31, 11:30 am, jcomet <[email protected]> wrote:
> I get the same behavior in NH 3.
>
> On Aug 31, 11:06 am, Diego Mijelshon <[email protected]> wrote:
>
>
>
> > I couldn't reproduce that in NH 3. Can you check with it?
>
> > Diego
>
> > On Tue, Aug 31, 2010 at 11:45, jcomet <[email protected]> wrote:
> > > When add a restriction on a particular string property with a value
> > > of "true" or "false", NH (2.1.2.4000) changes it to a bit value. See
> > > example class, hbm, query and resulting SQL. Note in the last snip,
> > > the line "WHERE this_.SettingValue = 1" should read "WHERE
> > > this_.SettingValue = 'true'. If I change the restriction from "true"
> > > to "poop", the NH correctly surrounds poop with quotes. My conclusion
> > > is that NH tries to convert the string value to boolean, and if it
> > > can, it does so using the value substitution from the session factory
> > > configuration. This is curious, since NH knows that column is a
> > > string from the mapping, so why would it need to guess? Is there a
> > > way to inform NH not to do this?
>
> > > namespace MYAPP.Core.Domain
> > > {
> > > public class EmployeeSetting
> > > {
> > > public virtual int ID { get; set; }
> > > public virtual string SettingValue { get; set; }
> > > public virtual Employee Employee { get; set; }
> > > public virtual SettingType SettingType { get; set; }
> > > }
> > > }
>
> > > <?xml version="1.0" encoding="utf-8" ?>
> > > <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
> > > assembly="MYAPP.Core" namespace="MYAPP.Core.Domain">
> > > <class name="MYAPP.Core.Domain.EmployeeSetting,MYAPP.Core"
> > > table="EmployeeSetting">
> > > <id name="ID" column="ID" type="Int32" unsaved-value="0">
> > > <generator class="native" />
> > > </id>
> > > <property name="SettingType" column="SettingType"
> > > type="MYAPP.Core.Domain.SettingType, MYAPP.Core" not-null="false" />
> > > <property name="SettingValue" column="SettingValue" type="string"
> > > not-null="false" />
> > > <many-to-one name="Employee" column="EmployeeID"
> > > class="MYAPP.Core.Domain.Employee,MYAPP.Core.Domain"/>
> > > </class>
> > > </hibernate-mapping>
>
> > > IList<EmployeeSetting> es = _EmployeeSettingDAO.GetSession()
> > > .CreateCriteria<EmployeeSetting>()
> > > .Add(Restrictions.Eq("SettingValue", "true"))
> > > .Add(Restrictions.Eq("SettingType",
> > > SettingType.ReceiveAlerts))
> > > .List<EmployeeSetting>();
>
> > > SELECT this_.ID as ID8_0_,
> > > this_.SettingType as SettingID8_0_,
> > > this_.SettingValue as SettingV3_8_0_,
> > > this_.EmployeeID as EmployeeID8_0_
> > > FROM EmployeeSetting this_
> > > WHERE this_.SettingValue = 1 /* @p0 */
> > > and this_.SettingType = 1 /* @p1 */
>
> > > --
> > > 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.-Hide quoted text -
>
> > - Show quoted text -- Hide quoted text -
>
> - Show quoted text -
--
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.