问题描述
@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;