我正在使用spring-boot
,spring-data-JPA
和Hibernate
,并且我有一个Form Entity
和一个Group Entity
,并且它们之间的关系是@ManyToMany
他们之间。
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name = "form_group",
joinColumns = @JoinColumn( name = "form_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "group_id", referencedColumnName = "id"))
@JsonIgnore
private Collection<Group> groups;
在FormRepository
类中,我有一个称为
public List<Form> findByGroups(Collection<Group> userGroups);
,其参数类型为Collection<Group>
,并期望返回至少属于作为方法参数传递的组之一的所有形式。这是查询:
@Query("SELECT new com.nsia.model.Form(f.id, f.name, f.description, f.createdAt, f.groups, COUNT(i.id)) from Form f LEFT JOIN f.instances i WHERE f.groups IN (?1) group by f.id")
如您所见,userGroups
的类型为Collection<Group>
,在Form Entity
内的类型相同。调用方法findByGroup
时,它将引发java.lang.IllegalArgumentException
,这是完整的消息:
java.lang.IllegalArgumentException: Parameter value [Group {id=4, name='DATA_ENTRY_GROUP', description='DATA ENTRY GROUP'}] did not match expected type [java.util.Collection (n/a)]
我确定userGroups
的类型为Collection<Group>
,因为这是我在FormServiceImpl
类中获取它的方式:
Collection<Group> groups = userService.getLoggedInUser().getGroups();
formsList = formRepository.findByGroups(groups);
StackOverflow中有很多类似的问题,我已经尝试了其中的每一个,但没有一个对我有用,任何帮助将不胜感激。谢谢
答案 0 :(得分:0)
无法尝试。
构造函数表达式不能将集合作为参数,因为底层SQL select语句的结果始终是一个表。
因此,您唯一可以做的就是在加入f.groups的情况下将这样的笛卡尔积返回。
@Query("SELECT new com.nsia.model.Form(f.id, f.name, f.description, f.createdAt, g, COUNT(i.id)) from Form f LEFT JOIN f.instances JOIN f.groups g WHERE f.groups IN (?1) group by f.id")
因此,您将获得每个组的记录,但这可能不是您想要的。