PropertyNotFoundException: 在 class 上找不到 column_name 的 setter
PropertyNotFoundException: Could not find setter for column_name on class
我正面临使用 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 |
+---------------+---------------+------+-----+-------------------+-----------------------------+
这个答案看起来很糟糕,但我也遇到了同样的问题。有时休眠不检测属性 setter 和 getter。我通过从 bean 中删除所有 setter 和 getter 解决了这个问题,然后再次通过 eclipse 快捷方式创建相同的内容。这是工作。
你也可以这样做。
因为您正在使用 Transformers.aliasToBean
,它使用别名来查找 resultClass (NpUploads
)
的 setter 方法
为了使 Transformers.aliasToBean
正常工作,您需要在查询中使用正确的别名。如果你的 NpUploads
class 中的 属性 名字是 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>
The types declared and used in the mapping files are neither Java
data types nor SQL database types. Instead, they are Hibernate mapping
types. Hibernate mapping types are converters which translate between
Java and SQL data types.
所以java.lang.Integer是java类型不是休眠映射类型,
参见 Hibernate types
尝试将 java.lang.Integer
更改为 integer
<id name="docId" type="integer">
<column name="doc_id" />
<generator class="identity" />
</id>
我正面临使用 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 |
+---------------+---------------+------+-----+-------------------+-----------------------------+
这个答案看起来很糟糕,但我也遇到了同样的问题。有时休眠不检测属性 setter 和 getter。我通过从 bean 中删除所有 setter 和 getter 解决了这个问题,然后再次通过 eclipse 快捷方式创建相同的内容。这是工作。 你也可以这样做。
因为您正在使用 Transformers.aliasToBean
,它使用别名来查找 resultClass (NpUploads
)
为了使 Transformers.aliasToBean
正常工作,您需要在查询中使用正确的别名。如果你的 NpUploads
class 中的 属性 名字是 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>
The types declared and used in the mapping files are neither Java data types nor SQL database types. Instead, they are Hibernate mapping types. Hibernate mapping types are converters which translate between Java and SQL data types.
所以java.lang.Integer是java类型不是休眠映射类型, 参见 Hibernate types
尝试将 java.lang.Integer
更改为 integer
<id name="docId" type="integer">
<column name="doc_id" />
<generator class="identity" />
</id>