2014-07-09 77 views
0

我有一個實體的過濾集合(多對多,直接,懶惰)持有至實體的集合B.查詢使用彈簧規格

我需要查詢數據庫的引用,搜索實體基於上它引用的B類的元素。我如何用Spring規範來做到這一點?

+0

什麼是「彈簧規格」?你想要做什麼?你遇到了哪個錯誤? –

+0

這些規範:http://docs.spring.io/spring-data/jpa/docs/1.4.3.RELEASE/reference/html/jpa.repositories.html#specifications 我想查詢數據庫的實體過濾他們對實體B,其中A擁有一個集合。如'獲取包含這些B對象的A實體'。 –

+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,你要比較扔ç

值規範可以擴展這種方式:

cb.equal(root.join(A_.bs).get(B_c).get(c_.property), prop); 

B_C_A_是你的實體的元模型。 希望這會有所幫助。