我有一个问题,加载我的懒集合会产生大量的SQL语句,我不知道是否没有更有效的方式来加载数据。用hibernate/spring一次加载所有懒集合
现状:
家长有儿童叫孩子的懒惰集合。它实际上是一个多对多的关系。
我加载的家长个清单,一个CrudRepository,我需要得到所有child_ids每个家长。所以每次访问子集合时,我都会执行一个新的SQL语句。
如果我加载200 父母有201个查询执行(1代表父母的名单,1代表每个家长的孩子)。
任何想法如何我只能用一个查询加载数据?
编辑1
父/子可能是一个不好的命名在这里。事实上,我有一个多对多的关系。
下面是一些代码:
@Entity
public class Tour {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name="system-uuid",
strategy = "uuid2")
@Column(length = 60)
private String id;
@ManyToMany
@JoinTable(
name="parent_images",
joinColumns = @JoinColumn(name="tour_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name="image_id", referencedColumnName = "id"),
foreignKey = @ForeignKey(name = "FK_TOUR_IMAGE_TOUR"),
inverseForeignKey = @ForeignKey(name = "FK_TOUR_IMAGE_IMAGE")
)
private List<Image> images = new ArrayList<>();
}
@Entity
public class Image {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name="system-uuid",
strategy = "uuid2")
@Column(length = 40)
private String id;
//....
}
// Code to fetch:
@Autowired
TourRepository repo;
List<Tour> tours = repo.findBy(....);
List<String> imageIds = new ArrayList<>();
for(Tour tour : tours){
imageIds.addAll(tour.getImages().stream().map(b -> b.getId()).collect(Collectors.toList()));
}
如果你只需要父母与孩子的所有的ID对每个父母,为什么不直接使用基于JDBC的DAO(使用'JdbcTemplate',例如)此方法,写一个简单的SQL像'选择PARENT_ID,child_id父母,孩子们加入......'? –
显示您的代码请..实体,回购,使用例如与坏的结果...... – Cepr0
当我们谈论亲子,它应该是一个一对多.. –