我面对的是名为query和transform to bean的hibernates。
代码如下:
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)
哈佛商学院:
<?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>
还有波乔:
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 |
+---------------+---------------+------+-----+-------------------+-----------------------------+
最佳答案
当您使用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>