我正在使用 spring-boot ,并拥有这 3 个实体:
实体应用程序用户
@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);
}
}
实体契约(Contract)
@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);
}
}
这是我正在使用的映射:
-AppUser 和 Contrat 之间的 One_to_many 。
-项目和契约(Contract)之间的一对多。
所以 Contrat 位于 AppUser 和 Project 之间。
我正在尝试在存储库中编写请求以获取没有指定项目的 AppUser 列表。
我试过了
@Query("select u from AppUser u inner join u.roles r inner join u.contrats c where r = :role and c.appUser not in (" +
"select d.appUser from Contrat d where d.project = :project )")
所以我想获取没有这个项目':project'的用户列表
但我得到一个空列表,而我应该获取所有 AppUsers 的列表,因为在我的应用程序中还没有任何 appuser 的项目。
知道如何写这个请求吗?
最佳答案
首先,我假设这是 spring-data-jpa
,以 Hibernate
作为底层实现。
我的 HQL 有点生疏,但这样的东西应该可以工作:
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)
这是一篇好文章:http://www.codewrecks.com/blog/index.php/2010/03/09/power-of-hql-condition-on-a-collection/
关于java - 无法在 spring-data 中写入正确的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50690528/