JPA, как выбрать, где массив содержит значение? - PullRequest
0 голосов
/ 02 мая 2019

У меня есть объект MyObject, подобный (я использую зависимость hibernate-array-contributor для управления массивом):

@Entity
@Table(name = "mytable")
@NamedQueries({
        @NamedQuery(name = "findAll",
            query = "SELECT n FROM mytable n"),
        @NamedQuery(name = "getForUsers",
            query = "SELECT n FROM mytable n WHERE users @> :users")            
    })
public class MyObject{
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private long id;

   @Column(name="title")
   private String title; 

   @Column(name="users", columnDefinition="bigint array")
   private Long[] users ;

   //constructor, getters and setters
}

У меня возникает проблема, когда я хочу использовать именованный запрос getForUsers:

org.hibernate.HibernateException: ошибки в именованных запросах: Ошибка getForUsers из-за: org.hibernate.QueryException: неожиданный символ: '@' [ВЫБРАТЬ n ИЗ MyObject n ГДЕ пользователи @>: пользователи]

Но когда я написал это в pgAdmin, он работал хорошо. Как я могу это сделать?
Заранее спасибо.

- EDIT -

Я думаю, что нашел способ делать то, что я хочу, я модифицирую свой объект так:

@Entity
@Table(name="mytable")
@NamedQueries({
   @NamedQuery(name="findAll",query = "SELECT n FROM mytable n"),
   @NamedQuery(name="getForUser", query = "SELECT n FROM mytable n WHERE :user MEMBER OF n.users")
 })
 public class MyObject{
   @Id
   @GeneratedValue(startegy = GenerationType.IDENTITY)
   private long id;

   @Column(name="title")
   private String title;

   @ElementCollection
   private Set<Long> users = new HashSet<>();

   //constructor, getters and setters
}

Это добавляет таблицу myobject_users, где есть myobject_id и столбцы пользователей. Спасибо @Viktor Gubin за ссылки, которых я не знал "MEMBER OF"

1 Ответ

0 голосов
/ 06 мая 2019

Мое редактирование не позволяет удалять или обновлять (ElementCollection), поэтому с начальным состоянием это работает:

@NamedNativeQueries({
    @NamedNativeQuery(name="getForUser", query = "SELECT * FROM mytable n WHERE n.users @> ?1 ", resultClass=MyObject.class)
}) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...