工作环境:SpringMvc(4.3.5.release)+Hibernate(5.2.6.final)+SQL Server 2008 r2

构建工具:Maven


问题描述:

在使用Hibernate生成的Dao中的findByExample方法无法查询到任何值。


 

这是数据库的表格:

 

 这是生成的实体类:

package com.aocshallo.orm;
// Generated 2017-1-16 16:30:18 by Hibernate Tools 5.2.0.CR1

import java.io.Serializable;

/**
 * CompanyInfo generated by hbm2java
 */
public class CompanyInfo implements java.io.Serializable {

    private Integer id;
    /**
     * 单位名称
     */
    private Serializable name;
    /**
     * 单位代码
     */
    private Serializable code;

    public CompanyInfo() {
    }

    public CompanyInfo(Serializable name, Serializable code) {
        this.name = name;
        this.code = code;
    }

    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Serializable getName() {
        return this.name;
    }

    public void setName(Serializable name) {
        this.name = name;
    }

    public Serializable getCode() {
        return this.code;
    }

    public void setCode(Serializable code) {
        this.code = code;
    }

}

 

除了注释,其它都是自动生成的。可以看到属性默认生成的类型都是Serializable。

下面是对应的hbm.xml文件内容。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-1-16 16:30:18 by Hibernate Tools 5.2.0.CR1 -->
<hibernate-mapping>
    <class name="com.aocshallo.orm.CompanyInfo" table="CompanyInfo" schema="dbo" catalog="SignWebData" optimistic-lock="version">
        <id name="id" type="java.lang.Integer">
            <column name="Id" />
            <generator class="identity" />
        </id>
        <property name="name" type="serializable">
            <column name="Name" not-null="true" />
        </property>
        <property name="code" type="serializable">
            <column name="Code" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

结果就是使用findByPoperty 没有结果。

package com.aocshallo.orm;

public class CompanyDao extends CompanyInfoHome implements ICompanyDao {

    @Override
    public CompanyInfo findByName(String name) {
        CompanyInfo ci = new CompanyInfo();
        ci.setName(name);
        
        return super.findByExample(ci).get(0);
    }

}

经过测试,将POJO中的Serializable 替换成实际的类型,再将hbm.xml中的对应字段更改成正确的字段,就可以正常查询到结果。