Liferay自定义查询转换问题

时间:2015-01-21 22:49:34

标签: java sql hibernate casting liferay

我正在使用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表相同,见下文:

Using a cast to AuditExport

当不使用强制转换时,服务会返回正确的数据,请参阅下文(为隐私屏蔽的某些数据):

Without a cast

为什么要复制数据?如何正确地投射结果集?

如果需要,我可以提供更多信息,谢谢。

1 个答案:

答案 0 :(得分:0)

好的,我的问题出在我的service.xml.

在我投射的模型中(在service.xml中定义)只有AuditId被定义为主键,但我正在检索包含其中许多数据集的数据集。

要解决此问题,我在AudiId中定义了AudiDetailKeyservice.xml的复合键,然后正确地投射数据集。