使用spring data和hibernate并尝试将此请求写入存储库:
@Query("select u from AppUser u inner join u.roles r inner join u.contrats c where r = :role and not exists ( from c.project p where p = :project)")
我的目标是从实体appuer获取appuser(用户)的列表,但是有条件的话,只有那些没有实体项目的用户。
更详细地说,project和appuser之间有一个实体契约,它包含project project,appuser appuser。
appuser和contart之间有一个到多个的映射(appuser可以有多个contart)。
在contart和project之间也有一个到多个的映射(一个project可以有多个contart)。
问题是这个请求返回一个空列表,而它应该返回一个12个用户的列表,因为他们没有指定的项目传递给它。
我在请求中注意到(来自c.project p,其中p=:project)“from”用红线下划线表示:
<expression> expected got <from> in spring-data hibernate.
有什么想法吗?
编辑
实体应用程序用户
@Entity
@Data
@AllArgsConstructor @NoArgsConstructor
public class AppUser implements Serializable {
@Id @GeneratedValue
private Long id;
@Column(unique = true)
private String username;
private String password;
private String prenom;
private String nom;
private Long tel;
private String cin;
private String email ;
@ManyToMany(fetch = FetchType.EAGER)
private Collection<AppRole> roles = new ArrayList<>();
@OneToMany(mappedBy = "appUser" )
@Fetch(value = FetchMode.SUBSELECT)
@JsonManagedReference(value="appuser-contrat")
private Collection<Contrat> contrats = new ArrayList<Contrat>();
public void addToContrats(Contrat contrat){
this.contrats.add(contrat);
}
}
实体合同
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Contrat implements Serializable{
@Id @GeneratedValue
private Long id;
private Date dateDebut ;
private Date dateFin ;
private Long idDevloppeur;
@ManyToOne
@JoinColumn(name = "Id_Project")
@JsonBackReference(value="projet-contrat")
private Project project;
@ManyToOne
@JoinColumn(name = "Id_AppUser")
@JsonBackReference(value="appuser-contrat")
private AppUser appUser;
}
实体项目
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Project implements Serializable{
@Id @GeneratedValue
private long id;
private String intitule;
private String description;
@OneToMany(mappedBy = "project" )
@Fetch(value = FetchMode.SUBSELECT)
@JsonManagedReference(value="projet-contrat")
private Collection<Contrat> contrats = new ArrayList<Contrat>();
public void addToContrats(Contrat contrat){
this.contrats.add(contrat);
}
}