使用spring规范查询过滤集合

时间:2014-07-09 09:10:16

标签: spring-data

我有一个实体A(ManyToMany,direct,lazy),它包含对实体B集合的引用。

我需要查询数据库,根据它引用的B类元素搜索实体A.我怎么能用Spring规范呢?

1 个答案:

答案 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。 希望这会有所帮助。