我有两个表User和Transaction。用户可能有多个事务。但我需要加入用户表和Transaction表中的最后一个事务。
到目前为止,我所做的是获取了用户数据,随之而来的是整个事务作为列表,但我需要将事务限制为持续1或最终事务。这是基于id的最大值。当为具有大量事务的用户提取延迟提取时,它变得越来越慢。如何修复此问题才能获得最后一笔交易。
像往常一样,我有
User{
Blah blah;
List<Transaction> transaction;
}
正在做
Criteria criteria = session.createCriteria(User.Class);
// Other Criteria applied here
criteria.list;
答案 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,第二个项目是其最后一个事务。用户将完整的事务列表作为集合,但可以将其配置为延迟加载。