2013-08-02 22 views
0

我已經繼承了一個應用程序,該應用程序從Oracle DB中檢索一些數據,然後將其轉換爲XML以供其他應用程序導入。後面爲什麼它需要以這種方式做的理由是有點長篇大論,但總之,我們有一個看起來是這樣的數據庫:如何使用hibernate逐列分組,並檢索所有列

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是唯一的,用於檢索從DB中的數據如下代碼:

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> 

我已經嘗試用突起對數據進行分組的ID - 但後來只檢索列ID,沒有別的 - 我得到轉換異常時試圖轉換檢索RecordInfo對象。

有什麼辦法,我可以使用標準和預測,以返回結果集類似於:

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

在「IRRELEVANT_COLUMN」的信息是不以任何方式使用 - 從而使檢索的準確記錄不要以任何方式影響應用程序,我只需要確保僅返回一個ID爲1的記錄,並且僅返回一個具有2的ID的記錄,依此類推等。

希望有足夠的信息。在此先感謝球員:)

+0

__We只使用值ID&CHILD_ID - 以前沒有IRRELEVANT_COLUMN,所以**每個ID都是唯一的** __:在你的例子有非唯一的ID,也不對ID + CHILD_ID;有什麼不對? –

回答

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 
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所有選項

相關問題