【发布时间】:2021-09-07 16:49:29
【问题描述】:
我有 3 个具有以下关系的实体。
@Table(name = "a")
@Entity
public class A{
@Id
@GeneratedValue
@Column(name = "a_uuid")
@OneToMany(mappedBy = "a", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<B> bList;
@OneToMany(mappedBy = "a", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<C> cList;
}
@Table(name = "b")
@Entity
public class B{
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(fetch = "a_uuid")
private A a;
}
@Table(name = "c")
@Entity
class C{
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(fetch = "a_uuid")
private A a;
}
我需要加入以上三个表,并且我为每个表使用单独的规范
@Component
public class SpecificationTableAUtil {
public Specification<A> tableACriteriaMatches(final SomeCriteria criteria) {
return (root, query, criteriaBuilder) -> {
List<Predicate> predicateList = new ArrayList<>();
predicateList .add(
criteriaBuilder.isNull(
root.get("some_column_in_table_a")));
Predicate[] predicates = new Predicate[predicateList.size()];
return criteriaBuilder.and(predicateList.toArray(predicates ));
};
}
}
}
@Component
public class SpecificationTableBUtil {
public Specification<A> tableBCriteriaMatches(final SomeCriteria criteria) {
return (root, query, criteriaBuilder) -> {
ListJoin<A, B> b =
root.joinList("bList", JoinType.LEFT);
List<Predicate> predicateList = new ArrayList<>();
predicateList .add(
criteriaBuilder.isNull(
b.get("some_column_in_table_b")));
Predicate[] predicates = new Predicate[predicateList.size()];
return criteriaBuilder.and(predicateList.toArray(predicates ));
};
}
}
}
来自我的服务类,
@Service
public class ServiceClass{
//Autowire the utilities
public Specification<A> getSpecification(final SomeCriteria criteria) {
return bUtil.tableBCriteriaMatches(criteria)
.and(aUtil.tableACriteriaMatches(criteria));
}
}
}
现在我也需要加入表 C。如何以更好的方式实现这一点?我需要让每个方法的代码行尽可能小
【问题讨论】:
标签: hibernate jpa spring-data-jpa jpa-2.0 hibernate-criteria