2017-08-06 3 views
0

私は春のブートを使用していると私はそれらのエンティティがあります。"親エンティティ"から検索するときの値でSpringリポジトリの結果をフィルタリングする方法は?

@Entity 
@Table(name = "usuario") 
@NamedQuery(name = "Usuario.findAll", query="select u from Usuario u where 
u.estactiv=true order by u.user") 
public class Usuario implements Serializable{ 
... 
@Column(name="usu_estactiv",nullable=false) 
private boolean estactiv=true; 


@OneToMany(mappedBy = "user", cascade = CascadeType.ALL) 
@JsonManagedReference 
private List<Roles> roles = new ArrayList<>(); 
...} 



@Entity 
@Table(name = "roles") 
@NamedQuery(name = "Roles.findAll", query="select r from Roles r where 
r.estactiv=true order by r.descripcion") 
public class Roles implements Serializable{ 
... 
@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(columnDefinition="integer", name="usu_id", nullable=false) 
@JsonBackReference 
private Usuario user; 

@Column(name="rol_estactiv",nullable=false) 
private boolean estactiv=true; 
...} 

そして、私のリポジトリ内を:

@RepositoryRestResource(collectionResourceRel = "usuario", path = "usuario") 
public interface UserRepository extends PagingAndSortingRepository<Usuario, 
Integer> { 

@Override 
@Query 
public Page<Usuario> findAll(Pageable pageable); 

Usuario findByUserAndEstactivTrue(@Param("user") String user); 
} 



@RepositoryRestResource(collectionResourceRel = "roles", path = "roles") 
public interface RolesRepository extends 
PagingAndSortingRepository<Roles,Integer>{ 

@Override 
@Query 
public Page<Roles> findAll(Pageable pageable); 

@Override 
@Query 
public Iterable<Roles> findAll(); 
} 

私がURLにアクセスしてください。 http://localhost:8080/api/usuario/私は、ユーザーestactivで取得=真:

enter image description here

が、私はhttp://localhost:8080/api/usuario/1/rolesに行くとき、私はトンを得ました彼:

enter image description here

そして、私はちょうど、各ユーザーための真の役割estactivと=、例えば取得するをしたい:

ユーザーadmin(ID = 1)は、2つの役割を持っているユーザ(偽)と私の役割のテーブルのadmin(真)が、私は/ api/usuario/1/rolesに行くとき私はちょうど(本当)adminを取得したい

私は私の質問が明確であることを願っています私はそれを修正するために知っている。あなたの助けを前にありがとう。

答えて

0

usarioテーブルのestactivプロパティをフィルタリングするために、ロールクエリにテーブルusarioを含む結合を追加する必要があります。

select r 
from Roles r 
inner join Usario u on r.usu_id=u.id 
where u.estactiv=true 
order by r.descripcion 
+0

こんにちは、@NamedQuery(org.hibernate.HibernateException:名前付きクエリのエラー:Roles.findAll)で内部結合を追加するとエラーが発生し、estactiv trueのロールだけが必要ですたとえば、私が/ api/usuario/1/rolesに行くときにユーザーadmin(wit id 1)のために、私はただestactivでロールを欲しい – silver1991

0

、さらにリストをフィルタQuery stringを利用し、このようなあなたのURLのクエリ文字列としてパラメータを渡すようにしてください:

http://localhost:8080/api/usuario/1/roles?estactiv=true. 

さて、あなたができることができ、クエリは次のようになります。このクエリ文字列に基づいて出力結果をフィルタリングするには、おそらく新しいクエリ/コードを記述してデータをフィルタリングしてみてください。

0

私はドキュメントを読んでいたし、私は解決策を見つける:

@GetMapping("/api/usuario/{userId}/roles") 
    public Collection<Roles> getRoles(@PathVariable Integer userId) { 
     return rolRepo.findByEstactivTrueAndUserId(userId); 
} 

そして:私のUserControllerでで次に

public Collection<Roles> findByEstactivTrueAndUserId(@Param("user") Integer 
user); 

:私のRolesRepositoryで

まず、私は、このメソッドを宣言します私はhttp://localhost:8080/api/usuario/1/rolesに行き、id = 1のusuarioに対してはestactiv = trueのロールしか得ません。

関連する問題