2017-01-05 5 views
0

Ich habe dieses Repository:Wie kann ich ein Prädikat aus einer HQL-Abfrage erstellen?

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

} 

Aber ich will die @Query von einem benutzerdefinierten Spring Data Specification, um es zu nennen mag sich ändern:

repository.findAll(new Allowed()); 

Ich habe hinzugefügt extends JpSpecificationExecutor<User> zu meinem Repository So und jetzt versuche ich die Specification Implementierung zu erstellen:

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

Wie kann ich die obige Abfrage in ein Prädikat konvertieren? Wie kann ich die Verknüpfung mit UserRole Einheit durchführen?

Antwort

1

Erstellen Sie eine Klasse, die die Spezifikation erstellt und zurückgibt. Der Vorteil ist, dass diese Klasse separate Spezifikationen basierend auf verschiedenen Situationen zurückgeben kann.

@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; 
      } 
     }; 
    } 
} 

Dann in Service-Klasse autowire nur die obige Klasse und es verwenden, wie unten

repo.findAll(userSpecification.getAllowedUserSpecification()); 

Die von Benutzer beitreten und Userrole ist nicht in der Spezifikation erforderlich, da Sie Beziehung zu setzen, während die Entity-Klasse erstellen .

Verwandte Themen