【发布时间】:2021-08-03 00:26:49
【问题描述】:
我有一个父实体,它有许多子对象,其中大部分是集合。见下文。
@Entity
@Table(name = "A")
public class A {
@Id
@Column(name = "ID")
private long id;
@OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
@JoinColumn(name = "A_ID", nullable = false)
private Set<B> setB;
@OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
@JoinColumn(name = "A_ID", nullable = false)
private Set<C> setC;
@OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
@JoinColumn(name = "A_ID", nullable = false)
private Set<D> setD;
// Skipping more collections as they are not needed for the example
// Standard getters and setters
}
现在classes B、C 和 D 有 A_ID 和另外 5 个String 列。请考虑他们 B1,B2,B3,B4,B5 等等。
我还有一个 A 的 CrudRepository
@Repository
public interface ARepository extends CrudRepository<A, Long> {
Optional<A> findById(Long id);
}
我想获取带有 id 的完整 A 对象,但 A 拥有的其他子集合(setB、setC、setD)包含每个 A_ID 的大约数千行。我想放置一个过滤器以仅获取给定 A_ID 的前 100 行。
我尝试将@Where(clause = "ROWNUM < 101") 放在集合上,但它不起作用,因为在查询中表名以ROWNUM 为前缀。
我还查看了Criteria 和Criterion,但我找不到任何可行的解决方案。
由于父类中有很多Objects 的集合。因此,对每个对象使用本机查询将带来太多的返工。
谁能帮我解决这个问题。如果您需要更多信息,请发表评论。
谢谢
【问题讨论】:
-
您好,不清楚的是您只需要 100 行的原因...您是否要解决性能问题?
-
你好@Sixro-它更像是一个 GUI 的东西。用户只想要前 100 个对象。而且其中一些收藏品有数百万件物品,因此不可能展示所有物品。用户同意
-
谢谢 Chitransh,很遗憾我帮不了你。我知道的唯一解决方案是从 FetchType.EAGER 切换到 LAZY 并减少批量大小,只加载您需要的孩子数量......但我认为你不想对所有其他用例产生影响......
-
是的,这不能解决我的问题,但感谢您查看
标签: java spring-boot hibernate hql