EnumType的Hibernate查询因Oracle而失败(但适用于MySQL)

时间:2013-07-12 00:21:42

标签: java oracle hibernate enums

我们在Constants.java中定义了以下Java枚举:

public enum ComponentType implements IsSerializable {
    NOC("NOC"),
    // other values not shown
    ;
}

我们有一个Component类,其类型为ComponentType:

public class Component implements Serializable {    
    private ComponentType type = null;
    // other code not shown
}

我们有一个Component.hbm.xml Hibernate映射文件,它将枚举字段映射到一列:

<hibernate-mapping default-lazy="false">
    <class name="our.package.Component" table="Component">
        <property name="type" column="TYPE">
             <type name="org.hibernate.type.EnumType">
                 <param name="enumClass">our.package.Constants$ComponentType</param>
                 <param name="type">12</param>
             </type>
         </property>
         <!-- other mappings not shown -->
      </class>
 </hibernate-mapping>

我们有一个DAO,使用以下方法查询任何字段的任何值:

protected T loadByX(Class<T> entityClass, String fieldName, Object fieldValue) {
    T result = null;
    try {
        session = HibernateUtil.currentSession();
        result = (T) session.createCriteria(entityClass).add(Restrictions.eq(fieldName, fieldValue)).uniqueResult();
        session.close();
    }
    catch (HibernateException he) {
        // code not shown
    }
    return result;
}

然后我们有以下代码调用DAO:

Component component = instanceOfComponentDao.loadByX(Component.class, "type", Constants.ComponentType.NOC);
if (component == null) {
    //
    // SECTION A
    //
}

当数据库是MySQL时,此代码全部有效。在COMPONENT表中,有一行具有值为“NOC”的类型列,并且通过调用loadByX()返回它,并且“SECTION A”代码不会执行。

但是,当数据库是Oracle 11时,此代码不起作用.COMPONENT表有一行,其类型列的值为“NOC”,但调用loadByX()返回null值,因为“SECTION A”代码被执行。

在使用Oracle代码时,有什么问题吗?

0 个答案:

没有答案