2017-01-05 6 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; 
      } 
     }; 
    } 
} 

次にServiceクラスにちょうど上記のクラスをautowireと

repo.findAll(userSpecification.getAllowedUserSpecification()); 

の下のユーザの参加とあなたがエンティティクラスを作成しながら、関係を設定する必要があるためのUserRoleが仕様で必要とされていないようにそれを使用します。

関連する問題