JPA,如何选择数组包含值的位置?

时间:2019-05-02 15:15:09

标签: java postgresql hibernate jpa

我有一个类似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
}

我想使用namedquery getForUsers时遇到一些问题:

  

org.hibernate.HibernateException:命名查询中的错误:   getForUsers失败,原因是:org.hibernate.QueryException:意外的字符:'@'[从MyObject中选择n个WHERE用户@>:users]

但是当我在pgAdmin中编写它时,它运行良好。我该怎么办?
提前致谢。

-编辑-

我认为找到了一种做我想要的方法的方法,我这样修改对象:

@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和users列。 感谢@Victor Gubin提供的链接,我不知道“成员”

1 个答案:

答案 0 :(得分:0)

我的编辑不允许删除或更新(ElementCollection),因此在初始状态下,此方法有效:

@NamedNativeQueries({
    @NamedNativeQuery(name="getForUser", query = "SELECT * FROM mytable n WHERE n.users @> ?1 ", resultClass=MyObject.class)
}) 
相关问题