PropertyNotFoundException:无法在类上找到column_name的setter

时间:2016-02-22 11:03:59

标签: java mysql hibernate named-query hibernate3

我正面临着名为query的hibernates并转换为bean。

以下是代码:

query = session.getNamedQuery( "LAST_ADDED_DOC" );
query.setString( "module", inNpUploads.getModuleName() );
query.setString( "mapping", inNpUploads.getMappingId() );
query.setResultTransformer( Transformers.aliasToBean( NpUploads.class ) );
dmsDb = query.list();

但是query.list()抛出异常:

org.hibernate.PropertyNotFoundException: Could not find setter for doc_id on class com.np.upload.pojo.NpUploads
    at org.hibernate.property.ChainedPropertyAccessor.getSetter(ChainedPropertyAccessor.java:44)
    at org.hibernate.transform.AliasToBeanResultTransformer.transformTuple(AliasToBeanResultTransformer.java:57)
    at org.hibernate.hql.HolderInstantiator.instantiate(HolderInstantiator.java:69)
    at org.hibernate.loader.custom.CustomLoader.getResultList(CustomLoader.java:330)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
    at org.hibernate.loader.Loader.list(Loader.java:2099)
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289)
    at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695)
    at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
    at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152)
    at com.np.upload.manager.FileUploadManager.listUploadedFiles(FileUploadManager.java:116)
    at com.np.upload.spring.controller.FileUploadController.prepareUploadPage(FileUploadController.java:222)
    at com.np.upload.spring.controller.FileUploadController.uploadPage(FileUploadController.java:84)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)

hbm

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Sep 30, 2015 10:32:57 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.np.upload.pojo.NpUploads" table="np_document_uploads" dynamic-update="true">
        <id name="docId" type="java.lang.Integer">
            <column name="doc_id" />
            <generator class="identity" />
        </id>
        <version name="version" type="java.lang.Integer">
            <column name="version" />
        </version>
        <property name="moduleName" type="string">
            <column name="module_name" not-null="true" />
        </property>
        <property name="mappingId" type="string">
            <column name="mapping_id" not-null="true" />
        </property>
        <property name="docType" type="string">
            <column name="doc_type" not-null="true" />
        </property>
        <property name="docName" type="string">
            <column name="doc_name" not-null="true" />
        </property>
        <property name="docPath" type="string">
            <column name="doc_path" length="1024" not-null="true" />
        </property>
        <property name="createdTime" type="timestamp" insert="false" update="false">
            <column name="created_time" length="19" />
        </property>
        <property name="modifiedTime" type="timestamp" insert="false" update="false">
            <column name="modified_time" length="19" />
        </property>
    </class>
    <sql-query name="LAST_ADDED_DOC">
       <![CDATA[SELECT d.* FROM np_document_uploads d
                JOIN(
                    SELECT module_name, mapping_id, doc_type, max(version) AS version
                    FROM np_document_uploads u
                    WHERE u.module_name=:module and u.mapping_id=:mapping
                    GROUP BY module_name, mapping_id, doc_type
                )tt USING( module_name, mapping_id, doc_type, version )
                WHERE d.module_name=:module and d.mapping_id=:mapping]]>
    </sql-query>
</hibernate-mapping>

pojo

public class NpUploads
    implements java.io.Serializable
{
    private static final long serialVersionUID = -5063169354511880324L;
    private Integer           docId;
    private Integer           version;
    private String            moduleName;
    private String            mappingId;
    private String            docType;
    private String            docName;
    private String            docPath;
    private Date              createdTime;
    private Date              modifiedTime;

    // getter and setters for all properties are there.
}

数据库架构:

+---------------+---------------+------+-----+-------------------+-----------------------------+
| Field         | Type          | Null | Key | Default           | Extra                       |
+---------------+---------------+------+-----+-------------------+-----------------------------+
| doc_id        | int(11)       | NO   | PRI | NULL              | auto_increment              |
| module_name   | varchar(255)  | NO   |     | NULL              |                             |
| mapping_id    | varchar(255)  | NO   |     | NULL              |                             |
| doc_type      | varchar(255)  | NO   |     | NULL              |                             |
| doc_name      | varchar(255)  | NO   |     | NULL              |                             |
| doc_path      | varchar(1024) | NO   |     | NULL              |                             |
| version       | int(6)        | YES  |     | NULL              |                             |
| created_time  | timestamp     | YES  |     | CURRENT_TIMESTAMP |                             |
| modified_time | timestamp     | YES  |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+---------------+---------------+------+-----+-------------------+-----------------------------+

3 个答案:

答案 0 :(得分:1)

这个答案看起来很可怕,但我面临同样的问题。有时候hibernate没有检测到属性setter和getter。我通过删除bean中的所有setter和getter然后再次通过eclipse shorcut创建相同来解决了这个问题。这是工作。 你也可以这样做。

答案 1 :(得分:0)

正在使用Transformers.aliasToBean使用别名来查找resultClass(NpUploads)的setter方法

为了使Transformers.aliasToBean正常工作,您需要在查询中使用正确的别名。如果NpUploads课程中的媒体资源名称为docId,则应使用select doc_id as docId

删除查询中的d.*并使用具有适当别名的单个列

在下面修改并检查link以供参考:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Sep 30, 2015 10:32:57 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.np.upload.pojo.NpUploads" table="np_document_uploads" dynamic-update="true">
        <id name="docId" type="java.lang.Integer">
            <column name="doc_id" />
            <generator class="identity" />
        </id>
        <version name="version" type="java.lang.Integer">
            <column name="version" />
        </version>
        <property name="moduleName" type="string">
            <column name="module_name" not-null="true" />
        </property>
        <property name="mappingId" type="string">
            <column name="mapping_id" not-null="true" />
        </property>
        <property name="docType" type="string">
            <column name="doc_type" not-null="true" />
        </property>
        <property name="docName" type="string">
            <column name="doc_name" not-null="true" />
        </property>
        <property name="docPath" type="string">
            <column name="doc_path" length="1024" not-null="true" />
        </property>
        <property name="createdTime" type="timestamp" insert="false" update="false">
            <column name="created_time" length="19" />
        </property>
        <property name="modifiedTime" type="timestamp" insert="false" update="false">
            <column name="modified_time" length="19" />
        </property>
        <loader query-ref="LAST_ADDED_DOC"/>
    </class>
    <sql-query name="LAST_ADDED_DOC">
        <return alias="up" class="NpUploads"/>       
        <![CDATA[SELECT d.doc_id as {up.docId},d.module_name as {up.moduleName},d.mapping_id as {up.mappingId},d.doc_type as {up.docType},d.doc_name as {up.docName},d.version as {up.version},d.doc_path as {up.docPath},d.created_time as {up.createdTime},d.modified_time as {up.modifiedTime} FROM np_document_uploads d
            JOIN(
                SELECT module_name, mapping_id, doc_type, max(version) AS version
                FROM np_document_uploads u
                WHERE u.module_name=:module and u.mapping_id=:mapping
                GROUP BY module_name, mapping_id, doc_type
            )tt USING( module_name, mapping_id, doc_type, version )
            WHERE d.module_name=:module and d.mapping_id=:mapping]]>
    </sql-query>
</hibernate-mapping>

答案 2 :(得分:0)

  

映射文件中声明和使用的类型都不是Java   数据类型也不是SQL数据库类型。相反,它们是 Hibernate映射   类型即可。 Hibernate映射类型是在它们之间进行转换的转换器   Java和SQL数据类型。

所以java.lang.Integer是java类型而不是hibernate映射类型, 见Hibernate types

尝试将java.lang.Integer更改为integer

<id name="docId" type="integer">
     <column name="doc_id" />
     <generator class="identity" />
</id>