使用'in'运算符的Spring JPA查询问题

问题描述

在Spring Intreface中,我有以下代码

@Query("select gl from GroupEntity gl where ?1 in gl.contacts ")
List<GroupEntity> findGroupsByContact(ContactEntity contactEntity);

并想查找所有具有联系人的组,但是IntelliJ提示在where条件之后显示错误(gl.contacts中的?1)并显示错误

'(' or <input parameter> expected,got 'gl'

解决方案是什么?

实体的相关部分是:

@Entity
@Table(name = "contactGroup")
public class GroupEntity {
...
    @ManyToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
    private List<ContactEntity> contacts;
...
}

但是在ContactEntity中,GroupEntity没有使用@ManyToMany(这是问题的根源吗?)

@Entity
@Table(name = "contact")
public class ContactEntity {
...
}

解决方法

当实体属性是正确的操作符时,不能使用in JPQL运算符。

您应该改用member of。 当您向查询提供值时,应使用“成员”来检查它是否属于您实体中的某个集合。 当您向查询提供值列表时,应使用“输入”,以检查实体中的属性是否属于此列表。

示例:

@Entity
public class EntityA {

@Id
private String id;

@ManyToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
private List<EntityB> entities;

}

JPQL:

SELECT a FROM EntityA a WHERE a.id IN :ids

SELECT a FROM EntityA a WHERE :b MEMBER OF a.entities
,

如果关系建立正确,则可以从联系人存储库中查询组。

Group.java

  @OneToMany(fetch=FetchType.EAGER,cascade = CascadeType.ALL,mappedBy = "group",orphanRemoval = true)
    List<Contact> contacts = new ArrayList<Contact>();

Contact.java

@ManyToOne
Group group;