Использование HashSet в качестве аргумента в JPA NamedQuery создает исключение IllegalArgumentException - PullRequest
0 голосов
/ 22 апреля 2020

Я установил NamedQuery следующим образом:

@Entity
@Table(name = "channel")
@NamedQuery(name = "Channel.getPrivateChannel", query = "SELECT pvt from Channel pvt WHERE pvt.state = 3 AND pvt.channelOwnerWorkspace = :channelOwnerWorkspace AND pvt.channelSubscribers = :channelSubscribers")
public class Channel implements Serializable {

...

@Column(nullable = false)
    private int type;

@ManyToOne
    @JoinColumn(name = "workspaceId")
    private Workspace channelOwnerWorkspace;

@ManyToMany(mappedBy = "subscribedChannels", fetch = FetchType.EAGER)
    private Set<User> channelSubscribers;

Все переменные не равны NULL и существуют; и при вызове указанного запроса я получаю исключение IllegalArgumentException, например:

Parameter value [pt.project.entity.User@4125ce40] did not match expected type [java.util.Set (n/a)]

Здесь выдается исключение:

public Channel findPrivateChannel1(String workspace, Set<User> channelSubscribers) {


///

        Workspace selectedWorkspace = workspaceDAO.findByTitle(workspace);

        try {
            Channel pvtChannel = em.createNamedQuery("Channel.getPrivateChannel", Channel.class)
                    .setParameter("channelOwnerWorkspace", selectedWorkspace)
                    .setParameter("channelSubscribers", channelSubscribers).getSingleResult();

Что я делаю не так? Можно ли даже установить HashSet в качестве параметра?

Заранее спасибо.

1 Ответ

0 голосов
/ 23 апреля 2020

Оператор сравнения равно, соответственно JSR-338 , пункт 4.6.7, нельзя использовать со всей коллекцией:

Что касается примечания, неясно, что является Ваша цель в использовании сравнения двух целых списков. Более конкретно, вы могли бы использовать некоторые очень полезные выражения коллекции для выбора ваших объектов, таких как IN, MEMBER OF или IS EMPTY, или даже некоторые подвыборы (ANY, SOME или ALL).

...