0

我继承了一个应用程序,该应用程序从 Oracle DB 检索一些数据,然后将其转换为 XML 以供另一个应用程序导入。为什么需要以这种方式完成的原因有点冗长,但简而言之,我们有一个看起来像这样的数据库:

ID | CHILD_ID | IRRELEVANT_COLUMN
1  | 100      | A
2  | 200      | E
2  | 200      | B
3  | 300      | G
3  | 300      | ZZ
3  | 300      | WHO_KNOWS_WHAT_MIGHT_END_UP_HERE

我们只使用值 ID 和 CHILD_ID - 以前没有 IRRELEVANT_COLUMN,因此每个 ID 都是唯一的,并且使用以下代码从数据库中检索数据:

public static List<RecordInfo> getRecordInfo() {
    List<RecordInfo> recordInfo = null;
    Session session = HibernateUtils.getSessionFactory().openSession();
    try {
        recordInfo = session.createCriteria(RecordInfo.class)
                .list();
    }
    catch (Exception e) {
        logger.error("Error reading database", e);
    }
    return recordInfo;
}

记录信息.java:

public class RecordInfo {

    private Long id;

    private Event event;

    private Integer childId;

    //Snip - Public Getters and Setters below.
}

RecordInfo.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="com.hewhowas.model.RecordInfo" table="NIGHTMARE_TABLE" lazy="false">
    <id name="id" type="long" column="ID">
        <generator class="native"/>
    </id>
    <property name="childId">
        <column name="CHILD_ID"/>
    </property>
    <many-to-one name="event" class="com.hewhowas.model.Event" column="CHILD_ID" fetch="join"/>
</class>

我尝试使用 Projections 按 ID 对数据进行分组 - 但随后它只检索列 ID 而没有其他内容 - 并且在尝试强制转换检索 RecordInfo 对象时出现强制转换异常。

有什么方法可以使用 Criteria 和 Projections 来返回类似于以下内容的结果集:

ID | CHILD_ID | IRRELEVANT_COLUMN
1  | 100      | A
2  | 200      | B
3  | 300      | WHO_KNOWS_WHAT_MIGHT_END_UP_HERE

“IRRELEVANT_COLUMN”中的信息没有以任何方式使用 - 所以检索到的确切记录不会以任何方式影响应用程序,我只需要确保只返回一个 id 为 1 的记录,并且只有一个返回 id 为 2 的记录,依此类推。

希望有足够的信息。在此先感谢各位:)

4

2 回答 2

1

我不确定您在尝试 Projections 时到底尝试了什么。考虑到这一点,我建议您尝试:

query.add(Projections.property(Id)).add(Projections.property(Child_id)).add(Projections.property(Irrelevant_Column)).add(Projections.groupProperty(Id))

我想说有多种方法可以写这个。基本上这个相当于:

select id, child_id, irrelevant_column
from RecordInfo
group by id 
于 2013-11-15T14:54:53.917 回答
0

您可以使用此查询:

with cte as (SELECT p.id, p.child_id,ROW_NUMBER() OVER (partition by p.id ORDER BY p.id) AS "RN" from RECORD_INFO p) select cte.id, cte.child_id from cte where rn = 1;

使用 SQLQuery,您可以映射到您的实体。检查Hibernate NativeSQL 文档以获取所有选项

于 2013-08-02T06:45:08.890 回答