powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Удаление записей соответствующих условию из БД в Hibernate
25 сообщений из 168, страница 1 из 7
Удаление записей соответствующих условию из БД в Hibernate
    #39971452
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

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

Код: java
1.
2.
3.
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)

Как удалять тогда, если нужно удалить сразу много записей соответствующих условию?
...
Рейтинг: 0 / 0
Удаление записей соответствующих условию из БД в Hibernate
    #39971454
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vlad__i__mir, пробовал делать так:
Код: java
1.
2.
3.
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)
...
Рейтинг: 0 / 0
Удаление записей соответствующих условию из БД в Hibernate
    #39971455
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vlad__i__mir, ещё пробовал такой вариант:

Код: java
1.
2.
3.
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)
...
Рейтинг: 0 / 0
Удаление записей соответствующих условию из БД в Hibernate
    #39971456
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir,

Сделайте пример из сети или книги. Что вы гадаете наобум?
...
Рейтинг: 0 / 0
Удаление записей соответствующих условию из БД в Hibernate
    #39971457
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir,

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

Если namePost - это поле в таблице Predictionlevelwater , то так:
Код: java
1.
2.
3.
Query q = sessionFactory.getCurrentSession().createQuery("DELETE FROM Predictionlevelwater WHERE namePost = :namePost");
q.setParameter("namePost", namePost);
q.executeUpdate();
...
Рейтинг: 0 / 0
Удаление записей соответствующих условию из БД в Hibernate
    #39971459
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий Мух
Vlad__i__mir,

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

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



namePost - это свойство у объекта, который является значением поля в таблице 22154615
...
Рейтинг: 0 / 0
Удаление записей соответствующих условию из БД в Hibernate
    #39971460
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp, везде примеры проще, без условия с ссылкой на свойство объекта, хранящегося в таблицк
...
Рейтинг: 0 / 0
Удаление записей соответствующих условию из БД в Hibernate
    #39971465
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir
Дмитрий Мух
Vlad__i__mir,

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

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




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

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

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

Тогда мы сначала попробуем написать соответсвующий SQL запрос, а потом уже вызвать его средствами Hibernate.
...
Рейтинг: 0 / 0
Удаление записей соответствующих условию из БД в Hibernate
    #39971467
xerxf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vlad__i__mir,

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

https://docs.spring.io/spring-data/jpa/docs/1.5.0.RELEASE/reference/html/jpa.repositories.html
...
Рейтинг: 0 / 0
Удаление записей соответствующих условию из БД в Hibernate
    #39971468
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий Мух,
В таблице Predictionlevelwater есть поле - это поле FK, FK ссылается на таблицу Post, у которой есть поле namePost.

Поэтому я в запросе и ссылался через точку, как бы обращаясь к полю объекта:
автор"DELETE FROM Predictionlevelwater e WHERE postId.namePost=:namePost"
...
Рейтинг: 0 / 0
Удаление записей соответствующих условию из БД в Hibernate
    #39971471
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir,
Если FK, то это число.
Если удаляете не по нему а имени то должен быть join.
ОТЛАЖИВАЙТЕ ЗАПРОС В ПРОГЕ ДЛЯ БД. Без java.
...
Рейтинг: 0 / 0
Удаление записей соответствующих условию из БД в Hibernate
    #39971473
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir,
2. Если немного элементов то можно удалять в цикле по коллекции. Ведь орм и хибер все таки.
...
Рейтинг: 0 / 0
Удаление записей соответствующих условию из БД в Hibernate
    #39971475
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp,

Сделал так:
1) нашел объект postId
2) выбрал из таблицы все записи с данным объектом
Код: java
1.
2.
3.
4.
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) с помощью цикла удаляю все объекты:
Код: java
1.
sessionFactory.getCurrentSession().remove(predictionlevelwater);



Конечно с точки зрения оптимальности алгоритм желает лучшего, но работает )
...
Рейтинг: 0 / 0
Удаление записей соответствующих условию из БД в Hibernate
    #39971476
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir,
Есть рационально и есть оптимально.
Удачи!
...
Рейтинг: 0 / 0
Удаление записей соответствующих условию из БД в Hibernate
    #39971477
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir
Дмитрий Мух,
В таблице Predictionlevelwater есть поле - это поле FK, FK ссылается на таблицу Post, у которой есть поле namePost.

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

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

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

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


Код: sql
1.
DELETE FROM Predictionlevelwater WHERE postId IN (SELECT id FROM Post WHERE namePost = :namePost)


Код: sql
1.
DELETE FROM Predictionlevelwater W WHERE EXISTS (SELECT 1 FROM Post P WHERE P.id = W.postId AND P.namePost = :namePost)
...
Рейтинг: 0 / 0
Удаление записей соответствующих условию из БД в Hibernate
    #39971478
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir
PetroNotC Sharp,

Сделал так:
1) нашел объект postId
2) выбрал из таблицы все записи с данным объектом
Код: java
1.
2.
3.
4.
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) с помощью цикла удаляю все объекты:
Код: java
1.
sessionFactory.getCurrentSession().remove(predictionlevelwater);




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

Хорошо, что вы нашли решение. И всё же я бы на вашем месте подтянул знания по SQL и переписал без циклов, одним запросом.
...
Рейтинг: 0 / 0
Удаление записей соответствующих условию из БД в Hibernate
    #39971480
Vlad__i__mir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий Мух, спасибо! 1-ый и 2-ой вариант мне в принципе понятен, JOIN пользоваться умею
Попробую ваш вариант.
...
Рейтинг: 0 / 0
Удаление записей соответствующих условию из БД в Hibernate
    #39971635
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad__i__mir
Конечно с точки зрения оптимальности алгоритм желает лучшего, но работает )

Да, у меня код типа такого и всё встаёт раком. Ява с гибернейтом уже где-то год в процессе выкидывания.
...
Рейтинг: 0 / 0
Удаление записей соответствующих условию из БД в Hibernate
    #39971645
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
Да, у меня код типа такого и всё встаёт раком. Ява с гибернейтом уже где-то год в процессе выкидывания.


Из дотнетов порт хибера уже давно повыпилили, а в джаве смотрю процесс ещё идёт )
...
Рейтинг: 0 / 0
Удаление записей соответствующих условию из БД в Hibernate
    #39971651
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,
Неужели один EF остался. Странно.
...
Рейтинг: 0 / 0
Удаление записей соответствующих условию из БД в Hibernate
    #39971680
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Там томик такой хороший по хиберу, я так и не осилил. Шоб просто работало, надо изучить этот талмуд. Но это не факт. Да да, батхёрт неосилятора.
...
Рейтинг: 0 / 0
Удаление записей соответствующих условию из БД в Hibernate
    #39971800
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
hVostt,
Неужели один EF остался. Странно.


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


crutchmaster
hVostt,

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


Просто хибер это убер-вундервафля :) Видимо и джаве тож самое.
...
Рейтинг: 0 / 0
Удаление записей соответствующих условию из БД в Hibernate
    #39971803
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Главное чтоб из стека SpringData его убрали.
...
Рейтинг: 0 / 0
Удаление записей соответствующих условию из БД в Hibernate
    #39971820
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,
Дак дай хоть пару имен то.
Мы не в курсе тут, что там за горизонтом, в Net уже нового.
...
Рейтинг: 0 / 0
Удаление записей соответствующих условию из БД в Hibernate
    #39971847
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
hVostt,
Дак дай хоть пару имен то.
Мы не в курсе тут, что там за горизонтом, в Net уже нового.


EF
Dapper
PetaPoco
LiteDB
SqlSugar
FreeSql
ServiceStack.OrmLite
Insight.Database
RepoDb
MicroLite
...
...
Рейтинг: 0 / 0
25 сообщений из 168, страница 1 из 7
Форумы / Java [игнор отключен] [закрыт для гостей] / Удаление записей соответствующих условию из БД в Hibernate
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]