如何从 HQL 查询创建谓词?
How can I create a Predicate from a HQL query?
我有这个存储库:
@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 数据 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
实体的连接?
创建一个class创建和return的规范,它的好处是这个class可以根据不同的情况[=23=]分离规范。
@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;
}
};
}
}
然后在服务 class 中自动装配上面的 class 并像下面那样使用它
repo.findAll(userSpecification.getAllowedUserSpecification());
规范中不需要 User 和 UserRole 的连接,因为您必须在创建实体时设置关系 class。
我有这个存储库:
@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 数据 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
实体的连接?
创建一个class创建和return的规范,它的好处是这个class可以根据不同的情况[=23=]分离规范。
@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;
}
};
}
}
然后在服务 class 中自动装配上面的 class 并像下面那样使用它
repo.findAll(userSpecification.getAllowedUserSpecification());
规范中不需要 User 和 UserRole 的连接,因为您必须在创建实体时设置关系 class。