Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4 5 6 7 8   вперед  Ctrl      все
 Удаление записей соответствующих условию из БД в Hibernate  [new]
Vlad__i__mir
Member

Откуда:
Сообщений: 294
Здравствуйте!

Пытаюсь из БД удалить записи соответствующие условию, с помощью запроса "createQuery" Hibernate:

Query q=sessionFactory.getCurrentSession().createQuery("DELETE Predictionlevelwater WHERE postId.namePost=:namePost", Predictionlevelwater.class);
q.setParameter("namePost", namePost);
q.executeUpdate();


На что он мне отвечает, что нельзя делать запросы на удаление/обновление.
автор
java.lang.IllegalArgumentException: Update/delete queries cannot be typed
org.hibernate.internal.AbstractSharedSessionContract.resultClassChecking(AbstractSharedSessionContract.java:763)
org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:746)
org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:104)
dao.PredictionLevelImplDao.dell(PredictionLevelImplDao.java:45)


Как удалять тогда, если нужно удалить сразу много записей соответствующих условию?

Сообщение было отредактировано: 21 июн 20, 15:53
21 июн 20, 15:54    [22154609]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей соответствующих условию из БД в Hibernate  [new]
Vlad__i__mir
Member

Откуда:
Сообщений: 294
Vlad__i__mir, пробовал делать так:
String namePost="Оск001";
Query q=sessionFactory.getCurrentSession().createQuery("DELETE Predictionlevelwater WHERE postId.namePost=:"+namePost);
q.executeUpdate();

Выдает исключение
автор
org.hibernate.QueryException: Named parameter not bound : Оск001
org.hibernate.query.internal.QueryParameterBindingsImpl.verifyParametersBound(QueryParameterBindingsImpl.java:210)
org.hibernate.query.internal.AbstractProducedQuery.beforeQuery(AbstractProducedQuery.java:1427)
org.hibernate.query.internal.AbstractProducedQuery.executeUpdate(AbstractProducedQuery.java:1606)
dao.PredictionLevelImplDao.dell(PredictionLevelImplDao.java:47)
21 июн 20, 16:16    [22154612]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей соответствующих условию из БД в Hibernate  [new]
Vlad__i__mir
Member

Откуда:
Сообщений: 294
Vlad__i__mir, ещё пробовал такой вариант:

Query q=sessionFactory.getCurrentSession().createQuery("DELETE FROM Predictionlevelwater e WHERE postId.namePost=:namePost");
q.setParameter("namePost", namePost);
q.executeUpdate();


автор
javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute statement
org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
org.hibernate.query.internal.AbstractProducedQuery.executeUpdate(AbstractProducedQuery.java:1617)
dao.PredictionLevelImplDao.dell(PredictionLevelImplDao.java:47)
21 июн 20, 16:31    [22154615]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей соответствующих условию из БД в Hibernate  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5384
Vlad__i__mir,

Сделайте пример из сети или книги. Что вы гадаете наобум?
21 июн 20, 16:34    [22154617]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей соответствующих условию из БД в Hibernate  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3796
Vlad__i__mir,

вы одновременно методом тыка учитесь и запросы писать и Hibernate?
ИМХО стоит метод тыка заменить на чтение документации.

Если namePost - это поле в таблице Predictionlevelwater, то так:
Query q = sessionFactory.getCurrentSession().createQuery("DELETE FROM Predictionlevelwater WHERE namePost = :namePost");
q.setParameter("namePost", namePost);
q.executeUpdate();
21 июн 20, 16:37    [22154618]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей соответствующих условию из БД в Hibernate  [new]
Vlad__i__mir
Member

Откуда:
Сообщений: 294
Дмитрий Мух
Vlad__i__mir,

вы одновременно методом тыка учитесь и запросы писать и Hibernate?
ИМХО стоит метод тыка заменить на чтение документации.

Если namePost - это поле в таблице Predictionlevelwater, то так:
Query q = sessionFactory.getCurrentSession().createQuery("DELETE FROM Predictionlevelwater WHERE namePost = :namePost");
q.setParameter("namePost", namePost);
q.executeUpdate();


namePost - это свойство у объекта, который является значением поля в таблице 22154615
21 июн 20, 16:47    [22154622]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей соответствующих условию из БД в Hibernate  [new]
Vlad__i__mir
Member

Откуда:
Сообщений: 294
PetroNotC Sharp, везде примеры проще, без условия с ссылкой на свойство объекта, хранящегося в таблицк
21 июн 20, 16:49    [22154623]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей соответствующих условию из БД в Hibernate  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3796
Vlad__i__mir
Дмитрий Мух
Vlad__i__mir,

вы одновременно методом тыка учитесь и запросы писать и Hibernate?
ИМХО стоит метод тыка заменить на чтение документации.

Если namePost - это поле в таблице Predictionlevelwater, то так:
Query q = sessionFactory.getCurrentSession().createQuery("DELETE FROM Predictionlevelwater WHERE namePost = :namePost");
q.setParameter("namePost", namePost);
q.executeUpdate();



namePost - это свойство у объекта, который является значением поля в таблице 22154615

У вас объект является значением поля в таблице? Вы ничего не путаете?

Можете дать описание таблицы, её назначение и сформулировать то, какие данные оттуда необходимо удалить.

Тогда мы сначала попробуем написать соответсвующий SQL запрос, а потом уже вызвать его средствами Hibernate.
21 июн 20, 17:21    [22154635]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей соответствующих условию из БД в Hibernate  [new]
xerxf
Member

Откуда:
Сообщений: 128
Vlad__i__mir,

Если вы пишете запрос - то вы пишете его к базе данных. Которая знать не знает ни про какие объекты и поля. Это во первых.
А во вторых - а зачем вы вообще этот запрос пишете? Может проще использовать методы репозитория?

https://docs.spring.io/spring-data/jpa/docs/1.5.0.RELEASE/reference/html/jpa.repositories.html
21 июн 20, 17:25    [22154637]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей соответствующих условию из БД в Hibernate  [new]
Vlad__i__mir
Member

Откуда:
Сообщений: 294
Дмитрий Мух,
В таблице Predictionlevelwater есть поле - это поле FK, FK ссылается на таблицу Post, у которой есть поле namePost.

Поэтому я в запросе и ссылался через точку, как бы обращаясь к полю объекта:
автор
"DELETE FROM Predictionlevelwater e WHERE postId.namePost=:namePost"
21 июн 20, 17:27    [22154639]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей соответствующих условию из БД в Hibernate  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5384
Vlad__i__mir,
Если FK, то это число.
Если удаляете не по нему а имени то должен быть join.
ОТЛАЖИВАЙТЕ ЗАПРОС В ПРОГЕ ДЛЯ БД. Без java.
21 июн 20, 18:12    [22154649]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей соответствующих условию из БД в Hibernate  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5384
Vlad__i__mir,
2. Если немного элементов то можно удалять в цикле по коллекции. Ведь орм и хибер все таки.
21 июн 20, 18:14    [22154651]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей соответствующих условию из БД в Hibernate  [new]
Vlad__i__mir
Member

Откуда:
Сообщений: 294
PetroNotC Sharp,

Сделал так:
1) нашел объект postId
2) выбрал из таблицы все записи с данным объектом
Query query=sessionFactory.getCurrentSession().createQuery("from Predictionlevelwater where postId.idPost=:idPost",Predictionlevelwater.class);
        query.setParameter("idPost", idPost);
        List<Predictionlevelwater> predictWaterList=query.list();
        return  predictWaterList;

3) с помощью цикла удаляю все объекты:
sessionFactory.getCurrentSession().remove(predictionlevelwater);


Конечно с точки зрения оптимальности алгоритм желает лучшего, но работает )
21 июн 20, 18:20    [22154653]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей соответствующих условию из БД в Hibernate  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5384
Vlad__i__mir,
Есть рационально и есть оптимально.
Удачи!
21 июн 20, 18:24    [22154654]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей соответствующих условию из БД в Hibernate  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3796
Vlad__i__mir
Дмитрий Мух,
В таблице Predictionlevelwater есть поле - это поле FK, FK ссылается на таблицу Post, у которой есть поле namePost.

Поэтому я в запросе и ссылался через точку, как бы обращаясь к полю объекта:
автор
"DELETE FROM Predictionlevelwater e WHERE postId.namePost=:namePost"

Из первого сообщения вы уже поняли, что Hibernate не умеет использовать информацию о типе (Predictionlevelwater.class) для построения правильного запроса DELETE.
То есть в вашем случае он ничего не знает о таблице Post и о том, что Predictionlevelwater на неё ссылается.

И вам самому сначала надо написать правильный запрос DELETE и потом вызвать его в коде Java с нужными параметрами.

Варианты:
DELETE W FROM Predictionlevelwater W JOIN Post P ON P.id = W.postId AND P.namePost = :namePost

DELETE FROM Predictionlevelwater WHERE postId IN (SELECT id FROM Post WHERE namePost = :namePost)

DELETE FROM Predictionlevelwater W WHERE EXISTS (SELECT 1 FROM Post P WHERE P.id = W.postId AND P.namePost = :namePost)
21 июн 20, 18:27    [22154655]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей соответствующих условию из БД в Hibernate  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3796
Vlad__i__mir
PetroNotC Sharp,

Сделал так:
1) нашел объект postId
2) выбрал из таблицы все записи с данным объектом
Query query=sessionFactory.getCurrentSession().createQuery("from Predictionlevelwater where postId.idPost=:idPost",Predictionlevelwater.class);
        query.setParameter("idPost", idPost);
        List<Predictionlevelwater> predictWaterList=query.list();
        return  predictWaterList;


3) с помощью цикла удаляю все объекты:
sessionFactory.getCurrentSession().remove(predictionlevelwater);



Конечно с точки зрения оптимальности алгоритм желает лучшего, но работает )

Хорошо, что вы нашли решение. И всё же я бы на вашем месте подтянул знания по SQL и переписал без циклов, одним запросом.
21 июн 20, 18:34    [22154656]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей соответствующих условию из БД в Hibernate  [new]
Vlad__i__mir
Member

Откуда:
Сообщений: 294
Дмитрий Мух, спасибо! 1-ый и 2-ой вариант мне в принципе понятен, JOIN пользоваться умею
Попробую ваш вариант.
21 июн 20, 18:53    [22154660]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей соответствующих условию из БД в Hibernate  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 1492
Vlad__i__mir
Конечно с точки зрения оптимальности алгоритм желает лучшего, но работает )

Да, у меня код типа такого и всё встаёт раком. Ява с гибернейтом уже где-то год в процессе выкидывания.
22 июн 20, 07:00    [22154874]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей соответствующих условию из БД в Hibernate  [new]
hVostt
Member

Откуда:
Сообщений: 17945
crutchmaster
Да, у меня код типа такого и всё встаёт раком. Ява с гибернейтом уже где-то год в процессе выкидывания.


Из дотнетов порт хибера уже давно повыпилили, а в джаве смотрю процесс ещё идёт )
22 июн 20, 07:59    [22154885]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей соответствующих условию из БД в Hibernate  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5384
hVostt,
Неужели один EF остался. Странно.
22 июн 20, 08:11    [22154891]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей соответствующих условию из БД в Hibernate  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 1492
hVostt,

Там томик такой хороший по хиберу, я так и не осилил. Шоб просто работало, надо изучить этот талмуд. Но это не факт. Да да, батхёрт неосилятора.

Сообщение было отредактировано: 22 июн 20, 09:32
22 июн 20, 09:34    [22154930]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей соответствующих условию из БД в Hibernate  [new]
hVostt
Member

Откуда:
Сообщений: 17945
PetroNotC Sharp
hVostt,
Неужели один EF остался. Странно.


Почему же, ORM-ов хватает. Всяких разных. Просто для NHibernate в своё время альтернатив не было, затем их запилили в нужном количестве, а хибер оказался избыточно сложным и неповоротливым поделием.


crutchmaster
hVostt,

Там томик такой хороший по хиберу, я так и не осилил. Шоб просто работало, надо изучить этот талмуд. Но это не факт. Да да, батхёрт неосилятора.


Просто хибер это убер-вундервафля :) Видимо и джаве тож самое.
22 июн 20, 13:02    [22155099]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей соответствующих условию из БД в Hibernate  [new]
mayton
Member

Откуда: loopback
Сообщений: 47969
Главное чтоб из стека SpringData его убрали.
22 июн 20, 13:19    [22155107]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей соответствующих условию из БД в Hibernate  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 5384
hVostt,
Дак дай хоть пару имен то.
Мы не в курсе тут, что там за горизонтом, в Net уже нового.
22 июн 20, 13:52    [22155131]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей соответствующих условию из БД в Hibernate  [new]
hVostt
Member

Откуда:
Сообщений: 17945
PetroNotC Sharp
hVostt,
Дак дай хоть пару имен то.
Мы не в курсе тут, что там за горизонтом, в Net уже нового.


EF
Dapper
PetaPoco
LiteDB
SqlSugar
FreeSql
ServiceStack.OrmLite
Insight.Database
RepoDb
MicroLite
...
22 июн 20, 14:21    [22155164]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4 5 6 7 8   вперед  Ctrl      все
Все форумы / Java Ответить