From: Fabio M. (JIRA) <nh...@gm...> - 2011-06-17 17:43:32
|
[ http://216.121.112.228/browse/NH-2521?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=21301#action_21301 ] Fabio Maulo commented on NH-2521: --------------------------------- Please attach a test case ASAP if you need it for NH3.2 (query-parameters management was completely re-wrote). http://nhforge.org/blogs/nhibernate/archive/2008/10/04/the-best-way-to-solve-nhibernate-bugs-submit-good-unit-test.aspx > Session.EnableFilter method should work for HQL-UPDATE statement > ---------------------------------------------------------------- > > Key: NH-2521 > URL: http://216.121.112.228/browse/NH-2521 > Project: NHibernate > Issue Type: Improvement > Components: DataProviders / Dialects > Affects Versions: 3.0.0.GA > Reporter: Hung Tran > Priority: Minor > > 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 |