表加入Hibernate

时间:2014-08-07 09:28:26

标签: java hibernate

我有两个表User和Transaction。用户可能有多个事务。但我需要加入用户表和Transaction表中的最后一个事务。

到目前为止,我所做的是获取了用户数据,随之而来的是整个事务作为列表,但我需要将事务限制为持续1或最终事务。这是基于id的最大值。当为具有大量事务的用户提取延迟提取时,它变得越来越慢。如何修复此问题才能获得最后一笔交易。

像往常一样,我有

User{

    Blah blah;
    List<Transaction> transaction;

}

正在做

Criteria criteria = session.createCriteria(User.Class);
// Other Criteria applied here
criteria.list;

2 个答案:

答案 0 :(得分:0)

我认为您需要从Child加入Parent:

select t 
from Transaction t
inner join fetch t.user u
where t.id = ( select max(id) from Transaction )

Hibernate无法返回部分一(多)个到多个集合。你总是会得到所有相关的孩子,因为那些孩子也会受到管理。

选择Child并获取Parent更适合此任务。

答案 1 :(得分:0)

这应该使用SQL而不是标准来完成。

select {u.*}, {t.*} from user as u inner join (select user_id, max(id) as max_t_id from transaction group by user_id) on u.id = user_id inner join transaction as t on t.id = max_t_id

阅读此文档:https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html

您应该setEntity("u", User.class)setEntity("t", Transaction.class)

从list方法中,您将获得一个Object []列表,其中第一个项目是user,第二个项目是其最后一个事务。用户将完整的事务列表作为集合,但可以将其配置为延迟加载。