以下是我UserRepository
课程中的一些方法:
// Get a user with all his roles
getWithRoles(Long userId);
// Get a user with all his posts
getWithPosts(Long userId);
// Get a user with all his activities
getWithActivities(Long userId);
// Get a user with all his relations
getWithAllRelations(Long userId);
这些方法都有类似下面的内容来确定要加载的关系:
// An example for getWithRoles(Long userId);
criteria.setFetchMode("roles", FetchMode.JOIN);
我尽力不在这些方法之间重复代码,但仍难以维持IMO。
有没有办法避免这种情况并最终得到像波纹管这样的东西?
userRepo.findOne(userId)
.withRelation(User_.roles)
.withRelation(User_.posts);
userRepo.findOne(userId)
.withRelation(User_.roles)
.withRelation(User_.activities);
userRepo.findOne(userId)
.withAllRelations();
我基本上都在寻找一种方法来重用关系提取器方法,而不是仅为此重写一个全新的方法。
PS:在上面的示例中,User_
是JPA Static Metamodel
答案 0 :(得分:0)
我想我刚刚发现了在存储库中实现它的想法。
我只需要将属性列表作为第二个参数传递。
get(Long userId, List<String> relations);
甚至更好
get(Long userId, List<Attribute> relations);
这个的实现将遍历关系参数,并逐个获取它们。
困难的部分是我必须处理嵌套关系。