如何从HQL查询创建谓词?

时间:2017-01-05 07:23:06

标签: spring-data spring-data-jpa jpql

我有这个存储库:

@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();

}

但我想通过自定义Spring Data @Query更改Specification,以便将其称为:

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 个答案:

答案 0 :(得分: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;
            }
        };
    }
}

然后在Service类中,只需自动装配上面的类并使用它,如下所示

repo.findAll(userSpecification.getAllowedUserSpecification());

规范中不需要User和UserRole的连接,因为您必须在创建实体类时设置关系。