将枚举集合作为参数列表的java Hibernate filterdef/filter转换为VARBINARY
冬眠:4.2.18。决赛-redhat-2 甲骨文:11g Java 1.7/1.8
父类(参见下面的hbm配置)由车辆集合组成。车辆a类属性VehicleType of Type enum。父表与车辆表具有一对多关系。 立柱式车辆。车辆类型为VARCHAR类型
问题发生在使用文件管理器def/过滤器按车辆类型(按集合集合)过滤车辆时。使用下面的配置,生成的hibernate查询没有产生任何结果。 我查看了日志并验证了生成的查询。仅供参考。我在SQLDeveloper中运行查询,并使用预期的参数,它按预期工作
出于好奇,我打开了参数跟踪,发现hibernate正在将枚举转换为VARBINARY,这似乎就是问题所在
17:30:12088跟踪[org.hibernate.type.descriptor.sql.BasicBinder](http-/127.0.0.1:8080-2)绑定参数[1]为[VARBINARY]-奥迪 17:30:12088跟踪[org.hibernate.type.descriptor.sql.BasicBinder](http-/127.0.0.1:8080-2)绑定参数[2]为[VARBINARY]-保时捷
作为测试,我将包含枚举名称的集合传递给过滤器参数列表,并将过滤器参数类型更新为字符串。这次是同一个查询,但这次,类型被浓缩为VARCHAR
17:55:12088跟踪[org.hibernate.type.descriptor.sql.BasicBinder](http-/127.0.0.1:8080-2)绑定参数[1]为[VARCHAR]-奥迪 17:55:12088跟踪[org.hibernate.type.descriptor.sql.BasicBinder](http-/127.0.0.1:8080-2)绑定参数[2]为[VARCHAR]-保时捷
常规插入工作正常,VehicleType转换为VARCHAR并持久化
我希望Hibernate能够像对待插入一样解析枚举值并将其转换为VARCHAR,或者在无法解析时抛出异常。这似乎是一个错误
<hibernate-mapping package="com.volks.cars"
default-access="field">
<class name="com.volks.cars.Parent"
entity-name="Parent" >
<list name="vehicles" inverse="false"
cascade="all-delete-orphan" lazy="false" batch-size="90">
<key column="cr_id" not-null="true"/>
<list-index column="cr_idx"/>
<one-to-many entity-name="Vehicle"/>
<filter name="vechicleFilter" condition="vehicle_type in (:vechicleFilter)"/>
</list>
<filter-def name="vechicleFilter">
<filter-param name="filterByVehicleType" type="com.volks.cars.enum.VehicleType"/>
</filter-def>
</hibernate-mapping>
<hibernate-mapping package="com.volks.cars"
default-access="field">
<class name="Vehicle"
entity-name="Vehicle">
<id name="id">
<generator class="native"/>
</id>
<property name="vehicleType" not-null="true">
<type name="org.hibernate.type.EnumType">
<param name="enumClass">
com.volks.cars.enum.VehicleType
</param>
<param name="useNamed">true</param>
</type>
</property>
</class>
</hibernate-mapping>
//Collection of VehicleType enum
Collection<VehicleType> vehicleTypes = new ArrayList<VehicleType>();
vehicleTypes.add(VehicleType.ROOT_REFERENCE);
vehicleTypes.add(VehicleType);
//Setting the collection of enum as a parameter list in the filer.
Filter filter = getCurrentSession().enableFilter("vechicleFilter");
filter.setParameterList("vechicleFilter", vehicleTypes);
public enum ChangeRequestReference {
AUDI,
PORSCHE,
VOLKS
}
共 (0) 个答案