2017-01-05 4 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(); 

} 

Но я хочу, чтобы изменить @Query с помощью пользовательских Spring Data 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) { 
     //?? 
    } 
} 

Как преобразовать запрос выше в Predicate? Как я могу выполнить соединение с 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; 
      } 
     }; 
    } 
} 

Тогда в службе класса просто autowire вышеупомянутого класса и использовать его, как показано ниже

repo.findAll(userSpecification.getAllowedUserSpecification()); 

Объединения Пользователя и UserRole не требуется в спецификации, потому что вы должны установить отношения при создании класса сущностей ,

Смежные вопросы