JPA, как вставить массив? - PullRequest
       2

JPA, как вставить массив?

1 голос
/ 30 апреля 2019

У меня есть объект MyObject, например:

@Entity
@Table(name = "mytable")
public class MyObject{
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private long id;

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

   @Column(name="users")//, columnDefinition="bigint[]")
   @ElementCollection   
   private List<Long> users = new ArrayList<>();

   //constructor, getters and setters
} 

С классом DAO MyObjectDAO.class, где определяется метод create (create (MyObject mo)), и класс ресурсов MyObjectResource с:

@POST
@UnitOfWork
public Response createMyObject(MyObject mo) {
    Response resp;
    try {
        MyObject mo0 = MyObjectDAO.create(mo);
        if(mo0!=null) {
            resp = Response.status(Response.Status.OK).entity(mo0).build();
        }
        else {
            resp = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("MyObjectnull, can't be created in database").build();
        }
    }
    catch(Exception e) {
        resp = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("MyObjectnull, can't be created in database\n"+e.getMessage()).build();
    }
    return resp;
}  

Когда я пытаюсь создать с помощью POST MyObject вроде {"id": 0, "title": "dyud u", "users": [334,335]}, я получаю сообщение об ошибке:

org.hibernate.engine.jdbc.spi.SqlExceptionHelper: Ошибка SQL: 0, SQLState: 42804 Ошибка.mais l'expression est de type bigint

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

INSERT INTO mytable ("title","users") VALUES ('t1','{334,335}');

Как я могу это сделать

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

Добавьте эту зависимость в свой проект и измените поле на:

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

Это будет работать для Hibernate версии 5.2+ до 6.0, затем необходимо обновить библиотеку.

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

Иначе это может работать без этой зависимости:

@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 и столбцы пользователей.Нет проблем для создания нового MyObject.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...