我有一个实体A(ManyToMany,direct,lazy),它包含对实体B集合的引用。
我需要查询数据库,根据它引用的B类元素搜索实体A.我怎么能用Spring规范呢?
答案 0 :(得分:4)
你可以这样做:
@Entity
public class A{
@ManyToMany
@JoinTable(....)
private Set<B> bs;
// getters and Setters
}
B类,假设你想通过比较b.property进行查询
@Entity
public class B{
@Column
private String property;
// getters and setters
}
提供规范的抽象类:
public abstract class ASpecifications{
public static Specification<A> findByProperty(final String prop) {
return new Specification<A>() {
@Override
public Predicate toPredicate(Root<A> root,
CriteriaQuery<?> arg1, CriteriaBuilder cb) {
return cb.equal(root.join(A_.bs).get(B_.property), prop);
}
};
}
}
现在以这种方式使用@服务层:
import static package.ASpecifications.*;
import static org.springframework.data.jpa.domain.Specifications.where;
@Transactional(...)
public List<A> findByJoinPropertyOFB(String prop){
Specifications<A> spec = where(findByProperty(prop));
retrun repository.findAll(spec);
}
现在确保您的存储库扩展JpaSpecificationExecutor<A>
如果B包含对另一个对象C
的引用,并且您想要比较抛出值C
规范可以通过这种方式扩展:
cb.equal(root.join(A_.bs).get(B_c).get(c_.property), prop);
B_
,C_
和A_
是您实体的MetaModel。
希望这会有所帮助。