Значение параметра [....] не соответствует ожидаемому типу [java.util.Collection (n / a)] - PullRequest
0 голосов
/ 11 июня 2019

Я использую 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 есть много похожих вопросов, и я попробовал каждый из них, и ни один из них не помог мне, любая помощь будет высоко оценена.БЛАГОДАРЯ

1 Ответ

0 голосов
/ 11 июня 2019

То, что вы пытаетесь, невозможно.

Выражение конструктора не может принимать коллекцию в качестве аргумента, поскольку результатом нижележащего оператора выбора 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")

Таким образом, вы получите запись по группе, но это, вероятно, не то, что вы хотите.

...