我正在使用Liferay服务构建器,其中包含一个跨两个表使用内部联接的自定义查询。
我还有一个空白服务,用于定义将返回的模型。
AuditExportFinderImpl.java
public List<AuditExport> getAuditExport(String auditIds) {
SQLQuery q = buildQuery(auditIds);
List<AuditExport> audits = (List<AuditExport>)q.list();
return audits;
}
private SQLQuery buildQuery(String auditIds) {
Session session = null;
SQLQuery q = null;
try {
session = openSession();
String sql = CustomSQLUtil.get(FIND_EXPORT_AUDITS);
sql = StringUtil.replace(sql, "[$AUDIT_IDS$]", auditIds);
q = session.createSQLQuery(sql);
q.setCacheable(false);
q.addEntity("AuditExport", AuditExportImpl.class);
} finally {
closeSession(session);
}
return q;
}
default.xml (自定义查询):
<custom-sql>
<sql id="findExportAudits">
<![CDATA[
SELECT
audititem.auditid,
audititem.orgid,
audititem.userid,
audititem.username,
audititem.firstname,
audititem.lastname,
audititem.createdate,
audititem.auditaction,
auditdetail.auditdetailkey,
auditdetail.auditdetailvalue
FROM audititem
INNER JOIN auditdetail ON audititem.auditid = auditdetail.auditid
WHERE audititem.auditid IN ([$AUDIT_IDS$])
]]>
</sql>
</custom-sql>
这将返回结果集列表(正确转换为AuditExport
),但每个记录的联接数据AuditDetail
表相同,见下文:
当不使用强制转换时,服务会返回正确的数据,请参阅下文(为隐私屏蔽的某些数据):
为什么要复制数据?如何正确地投射结果集?
如果需要,我可以提供更多信息,谢谢。
答案 0 :(得分:0)
好的,我的问题出在我的service.xml.
在我投射的模型中(在service.xml
中定义)只有AuditId
被定义为主键,但我正在检索包含其中许多数据集的数据集。
要解决此问题,我在AudiId
中定义了AudiDetailKey
和service.xml
的复合键,然后正确地投射数据集。