我正在使用遗留代码。我有entity A
和entity B
类,但由于entity B
被引用了很多地方,我尝试不对entity B
进行更改。以下是这两个实体的类。
Entity B
有一个外键列,它是entity A
的主键,在数据库表中,外键(aId)与表b(id)
的许多主键相关联。
我需要的是A的集合(id范围在1到10000之间),其中包括当我对table_a进行查询时对应于辅助的B的集合。当前实现首先获取A(具有大量行)的集合,然后循环遍历集合中的每个A,然后调用dao.findB(aId)为A设置B的集合。它导致多次访问数据库。我尽量减少这次旅行。例如,如果A有50,000行,则dao.findB(aId)将被调用50,000次。
table_b
----------
id table_a_id
1 2
2 2
3 2
4 3
5 3
@Entity
@Table(name = "table_a")
public class A{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private Long id;
}
@Entity
@Table(name = "table_b")
public class B{
private static final long serialVersionUID = 1L;
@Id
@Column(name="id", unique = true, nullable = false)
@GeneratedValue
private Long id;
@Column(name="table_a_id")
private Long aId;
}
答案 0 :(得分:1)
如下所示
假设您有aid
,您希望通过该Entity B
加载A a = session.find(A.class,aid); // just some pseudo code
Criteria cr = session.createCriteria(B.class);
cr.add(Restrictions.eq("aId", aid));
List<B> results = cr.list();
。
{{1}}
答案 1 :(得分:0)
在链接How to define unidirectional OneToMany relationship in JPA和http://en.wikibooks.org/wiki/Java_Persistence/OneToMany的帮助下,我在不更改实体B的情况下完成了工作。我确实检查了SQL日志,并节省了过多的数据库访问。
当我使用以下标准查询时,它返回了包含B集合的A的集合。
Criteria criteria = session.createCriteria(A.class).add(Restrictions.in("id", ids)).setFetchMode("bSet", FetchMode.JOIN).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
List<A> result = criteria.list();
@Entity
@Table(name = "table_a")
public class A{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private Long id;
@OneToMany
@JoinColumn(name="table_a_id", referencedColumnName="id")
private Set<B> bSet = new HashSet<B> ();
}
@Entity
@Table(name = "table_b")
public class B{
private static final long serialVersionUID = 1L;
@Id
@Column(name="id", unique = true, nullable = false)
@GeneratedValue
private Long id;
@Column(name="table_a_id")
private Long aId;
}