From: Hung T. (JIRA) <nh...@gm...> - 2011-01-29 09:26:11
|
Session.EnableFilter method does not work for UPDATE statement -------------------------------------------------------------- Key: NH-2521 URL: http://216.121.112.228/browse/NH-2521 Project: NHibernate Issue Type: Bug Components: DataProviders / Dialects Affects Versions: 3.0.0.GA, 3.0.0.CR1, 3.0.0.Beta2, 3.0.0.Beta1, 3.0.0.Alpha3, 3.0.0.Alpha2, 3.0.0.Alpha1, 2.1.2.GA, 2.1.1.GA, 2.0.1.GA, 1.2.1, 3.0.1 Reporter: Hung Tran See the case below ?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" default-access="field.camelcase-underscore" default-lazy="true" default-cascade="none" > <class name="Manufacturer" dynamic-update="true" dynamic-insert="true" optimistic-lock="version"> <id name="Id" unsaved-value="-1" type="Int64" length="18"> <generator class="native"/> </id> <version name="EntityVersion" unsaved-value="-1" type="Int32" /> <bag name="Categories" fetch="subselect" inverse="true" lazy="false" cascade="all-delete-orphan"> <key column="ManufacturerManufacturerCategory"/> <one-to-many class="ManufacturerCategory"/> </bag> <property name="Code" type="String" length="255" unique-key="codeEntityCode"/> <property name="Description" type="String" length="255"/> <property name="Name" type="String" length="255"/> <component name="RowInfo" class="RowInfo"> <property name="Status" type="NHibernate.Type.EnumStringType`1[[RowStatus, TestLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], NHibernate, Version=3.0.1.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4" column="RowInfoStatus"/> </component> <filter name="rowFilter" condition="ROW_INFO_STATUS = :rowStatus"/> </class> <class name="ManufacturerCategory" dynamic-update="true" dynamic-insert="true"> <id name="Id" unsaved-value="-1" type="Int64" length="18"> <generator class="native"/> </id> <many-to-one name="Category" class="ProductCategory" column="Category" index="IX_FK_EA201C336482F24" lazy="proxy"/> <many-to-one name="Manufacturer" class="Manufacturer" column="ManufacturerManufacturerCategory" index="IX_FK_EA201C33771511F1" lazy="proxy"/> </class> <class name="ProductCategory" dynamic-update="true" dynamic-insert="true" optimistic-lock="version"> <id name="Id" unsaved-value="-1" type="Int64" length="18"> <generator class="native"/> </id> <version name="EntityVersion" unsaved-value="-1" type="Int32" /> <property name="Code" type="String" length="255" unique-key="codeEntityCode"/> <property name="Description" type="String" length="255"/> <property name="Name" type="String" length="255"/> <component name="RowInfo" class="RowInfo"> <property name="Status" type="NHibernate.Type.EnumStringType`1[[RowStatus, TestLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], NHibernate, Version=3.0.1.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4" column="RowInfoStatus"/> </component> <filter name="rowFilter" condition="ROW_INFO_STATUS = :rowStatus"/> </class> <class name="EzzySalon.SaleModule.Model.Item" dynamic-update="true" dynamic-insert="true" optimistic-lock="version" discriminator-value="Item"> <id name="Id" unsaved-value="-1" type="Int64" length="18"> <generator class="native"/> </id> <discriminator type="String"> <column name="EntityDiscriminator" not-null="1" length="50" index="IX_TYPE_742DC178E1FAC3A0"/> </discriminator> <version name="EntityVersion" unsaved-value="-1" type="Int32" /> <property name="Barcode" type="String" length="20" index="IX_CODE_742DC17839B4419A" unique-key="barcode"/> <property name="Description" type="String" length="200"/> <property name="Discountable" type="Boolean"/> <property name="Name" type="String" length="100" unique-key="itemName"/> <component name="Price1" class="ItemPrice"> <property name="ExcVat" type="Decimal" column="Price1ExcVat"/> <property name="ExcVatCreep" type="Decimal" column="Price1ExcVatCreep"/> <property name="IncVat" type="Decimal" column="Price1IncVat"/> <property name="IncVatCreep" type="Decimal" column="Price1IncVatCreep"/> </component> <component name="RowInfo" class="RowInfo"> <property name="Status" type="NHibernate.Type.EnumStringType`1[[RowStatus, TestLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], NHibernate, Version=3.0.1.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4" column="RowInfoStatus"/> </component> <subclass name="StockItem" discriminator-value="StockItem" dynamic-update="true" dynamic-insert="true"> <property name="DefaultOrderCode" type="String" length="20"/> <property name="IsProfessional" type="Boolean"/> <property name="NumberRequired" type="Int32"/> <property name="PackageSize" type="Int32"/> <property name="PackageUnit" type="String" length="20"/> <property name="Quantity" type="Int32"/> <many-to-one name="Range" class="ManufacturerCategory" column="Range" index="IX_FK_4CAB57F44871503B" lazy="proxy"/> <property name="Size" type="String" length="20"/> <property name="StockLow" type="Int32"/> <property name="StockOnOrder" type="Int32"/> </subclass> <filter name="rowFilter" condition="ROW_INFO_STATUS = :rowStatus"/> </class> <filter-def name="rowFilter"> <filter-param name="rowStatus" type="NHibernate.Type.EnumStringType`1[[RowStatus, TestLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], NHibernate, Version=3.0.1.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4"/> </filter-def> </hibernate-mapping> HQL: UPDATE StockItem s SET s.Price1.ExcVatCreep = s.Price1.ExcVat * (1 + :perPrice1) + :moneyPrice1 WHERE s.Range in (SELECT mc.Id FROM ManufacturerCategory mc left join mc.Manufacturer m left join mc.Category p WHERE m.Code = :mCode and p.Code = :pCode) I got an exception below when the 'rowFilter' filter is enabled NHibernate.Exceptions.GenericADOException : could not execute update query[SQL: update `UT_ITEM` set `PRICE1_EXC_VAT_CREEP`=`PRICE1_EXC_VAT`*(1+?)+? where `ENTITY_DISCRIMINATOR`='StockItem' and (`RANGE` in (select manufactur1_.`ID` from `UT_MANUFACTURER_CATEGORY` manufactur1_ left outer join `UT_MANUFACTURER` manufactur2_ on manufactur1_.`MANUFACTURER_MANUFACTURER_CATEGORY`=manufactur2_.`ID` and manufactur2_.ROW_INFO_STATUS = :rowFilter.rowStatus left outer join `UT_PRODUCT_CATEGORY` productcat3_ on manufactur1_.`CATEGORY`=productcat3_.`ID` and productcat3_.ROW_INFO_STATUS = :rowFilter.rowStatus where manufactur2_.`CODE`=? and productcat3_.`CODE`=?))] ----> MySql.Data.MySqlClient.MySqlException : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'manufactur2_.ROW_INFO_STATUS = :rowFilter.rowStatus lef' at line 1 There are two serious problems here 1) In HQL, I am using name parameter, but in generated SQL, it's position parameter (I am using NHibernate.Driver.MySqlDataDriver, NHibernate.Dialect.MySQL5Dialect which supports name parameter) 2) The rowFilter is not applied for UPDATE -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://216.121.112.228/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira |