如何使用hibernate按列分组,并检索所有列

时间:2013-08-02 05:09:45

标签: java hibernate oracle10g

我继承了一个应用程序,它从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;
}

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对象时获得Cast Exceptions。

我有什么方法可以使用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的记录,依此类推。

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

2 个答案:

答案 0 :(得分:1)

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

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 

答案 1 :(得分: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 doc是否有所有选项