参数值[....]与预期的类型[java.util.Collection(n / a)]不匹配

时间:2019-06-11 07:42:13

标签: hibernate spring-boot spring-boot-jpa

我正在使用spring-bootspring-data-JPAHibernate,并且我有一个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中有很多类似的问题,我已经尝试了其中的每一个,但没有一个对我有用,任何帮助将不胜感激。谢谢

1 个答案:

答案 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")

因此,您将获得每个组的记录,但这可能不是您想要的。