1 Вопрос: JPA, как выбрать, где массив содержит значение?

вопрос создан в Thu, May 2, 2019 12:00 AM

У меня есть объект типа 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 и столбцы пользователей. Спасибо @Victor Gubin за ссылки, которых я не знал "MEMBER OF"

    
0
  1. Ожидающий спящий режим JPAQL или HQL вместо БД конкретный SQL. 2. Вам лучше использовать JPA Spring Data вместо повторного изобретать воли.
    2019-05-02 16: 01: 21Z
1 ответ                              1                         

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

@NamedNativeQueries({
    @NamedNativeQuery(name="getForUser", query = "SELECT * FROM mytable n WHERE n.users @> ?1 ", resultClass=MyObject.class)
}) 
    
0
2019-05-06 07: 10: 06Z
источник размещен Вот