java - 无法在 spring-data 中写入正确的请求

标签 java spring spring-boot spring-data

我正在使用 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/

相关文章:

java - 为什么 Java 不公开基于 toString/hashCode/equals 的编译时反射?

java - 如何在 log4j.properties 文件中设置占位符的值?

spring - 禁用某些网址的重定向/错误

java - 在测试之间共享 springcontext

java - Spring JPA - 数据完整性关系

java - WebClient 在 JUnit 中导致 "java.lang.IllegalStateException: executor not accepting a task"

Java Web 应用程序框架,用于处理需要长时间计算的进程的客户端回调

java - 将泛型应用于 java.util.Function

java - Spring 3中@Component和@Configuration的区别

java - 如何使用 MySQL 和 Hibernate 设置 group_concat_max_len