有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

将枚举集合作为参数列表的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) 个答案