|
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
|
|
From: Hung T. (JIRA) <nh...@gm...> - 2011-01-29 09:38:17
|
[ http://216.121.112.228/browse/NH-2521?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=20533#action_20533 ]
Hung Tran commented on NH-2521:
-------------------------------
When the 'rowFilter' filter is not enabled, it works fine, however, name parameter feature is lost, and polymophic query does not use parameter on discriminator column, which will force database engine recompile the SQL execution plan (very cost time)
update `UT_ITEM`
set `PRICE1_EXC_VAT_CREEP`=`PRICE1_EXC_VAT`*(1+?p0)+?p1
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`
left outer join `UT_PRODUCT_CATEGORY` productcat3_
on manufactur1_.`CATEGORY`=productcat3_.`ID`
where manufactur2_.`CODE`=?p2 and productcat3_.`CODE`=?p3))
?p0 = 0.01 [Type: Int32 (0)], ?p1 = 100 [Type: Decimal (0)], ?p2 = 'Dermalogica' [Type: String (11)], ?p23 = 'AGE smart' [Type: String (9)]
> 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: 1.2.1, 2.0.1.GA, 2.1.1.GA, 2.1.2.GA, 3.0.0.Alpha1, 3.0.0.Alpha2, 3.0.0.Alpha3, 3.0.0.Beta1, 3.0.0.Beta2, 3.0.0.CR1, 3.0.0.GA, 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
|
|
From: Fabio M. (JIRA) <nh...@gm...> - 2011-02-19 14:05:35
|
[ http://216.121.112.228/browse/NH-2521?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Fabio Maulo updated NH-2521:
----------------------------
Affects Version/s: (was: 3.1.0)
(was: 3.0.0.CR1)
(was: 3.0.0.Beta2)
(was: 3.0.0.Beta1)
(was: 3.0.0.Alpha3)
(was: 3.0.0.Alpha2)
(was: 2.1.2.GA)
(was: 2.1.1.GA)
(was: 3.0.0.Alpha1)
(was: 2.0.1.GA)
(was: 1.2.1)
> 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
> 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
|
|
From: Fabio M. (JIRA) <nh...@gm...> - 2011-02-19 14:09:30
|
[ http://216.121.112.228/browse/NH-2521?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Fabio Maulo updated NH-2521:
----------------------------
Priority: Minor (was: Trivial)
Issue Type: Improvement (was: Bug)
Summary: Session.EnableFilter method should work for HQL-UPDATE statement (was: Session.EnableFilter method does not work for UPDATE statement)
> 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
|
|
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
|