Я использую postgresql
и один из моих столбцов имеет тип json
.
Я использую REST API, и ответ, который я получаю, представляет собой строку json, которую я храню в этом столбце json
.
Используя Hibernate, я не могу выполнить обновление для этого столбца.
ПРИМЕЧАНИЕ. Я использую google Gson
чтобы сделать его json и сохранить его в db.
Пример:
Gson gson = new Gson();
myBean.setJsonData(gson.toJson(response));
myHomeDao.attachDirty(myBean); //Error Here
ЖУРНАЛ:
Caused by: org.postgresql.util.PSQLException: ERROR: column json_data" is of type json but expression is of type bytea
Hint: You will need to rewrite or cast the expression.
Position: 247
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2198)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1927)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:561)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:419)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:365)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208)
... 16 more
Это похоже на ошибку от Postgre, я нашел это обходное решение, которое вы можете использовать для решения своей проблемы.
Если это не поможет, возможно, вам понадобится написать настраиваемый тип hibernate, который использует метод setObject для драйверов jdbc вместо использования текста или байта.
Надеюсь, поможет!
Postgre
может быть такая ошибка, когда вам просто нужно сохранить json, и вы не найдете способа сделать это в обычном спящем режиме, а затем написать собственный запрос. В любом случае, я нашел способ написать запрос на обновление вместо спящего режима по умолчанию saveOrUpdate, который работал.
Transaction trans=sessionFactory.getCurrentSession().beginTransaction(); sessionFactory.getCurrentSession().saveOrUpdate(instance); trans.commit();