2017-01-05 55 views
0

我有這個資源庫:如何從HQL查詢創建謂詞?

@Repository 
public interface UserRepository extends 
     JpaRepository<User, String>, 
     JpaSpecificationExecutor<User> { 

    @Query("select u from User u, UserRole ur " + 
      "where u.dep = ur.dep " + 
      "and u.allowed = 1") 
    List<User> getAllowed(); 

} 

但我想通過一個自定義的春天數據Specification改變@Query,爲了把它想:

repository.findAll(new Allowed()); 

所以我已經加入extends JpSpecificationExecutor<User>到我的倉庫現在我試圖創建Specification實現:

public class Allowed implements Specification<User> { 
    @Override 
    public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) { 
     //?? 
    } 
} 

如何將上述查詢轉換爲謂詞?我如何執行與UserRole實體的加入?

回答

1

創建一個創建和返回規範的類,它的好處是這個類可以根據各種情況返回單獨的規範。

@Component 
public class UserSpecification { 
    public Specification<User> getAllowedUserSpecification() { 
     return new Specification<User>() { 

      @Override 
      public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) { 
       Predicate predicate = cb.equal(root.get("allowed"), "1"); 
       return predicate; 
      } 
     }; 
    } 
} 

然後在服務類中添加自動裝配上述類,並使用它像下面

repo.findAll(userSpecification.getAllowedUserSpecification()); 

用戶的加入和UserRole的不規範必需的,因爲你必須設置關係在創建實體類。