我继承了一个应用程序,它从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的记录,依此类推。
希望有足够的信息。在此先感谢你们:)
答案 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是否有所有选项