2

我正在使用spring-boot, spring-data-JPAandHibernate我有 aForm Entity和 aGroup 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")

如您所见,userGroupsis 的类型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 中有很多类似的问题,我已经尝试了每一个,但没有一个对我有用,任何帮助将不胜感激。谢谢

4

1 回答 1

1

你正在尝试的是不可能的。

构造函数表达式不能将集合作为参数,因为底层 SQL 选择语句的结果始终是一个表。

所以你唯一能做的就是在你加入 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")

所以你会得到每组的记录,但这可能不是你想要的。

于 2019-06-11T07:56:13.493 回答