powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate exception: не удаётся вернуть запрос из джойнов.
25 сообщений из 27, страница 1 из 2
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39746230
DrillDrive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче я стараюсь сделать запрос к двум сущностям с помощью джойнов, но при этом вернуть коллекцию сущностей определённого типа.

Вот ссылка на проект, а если ещё точнее на классы: здесь . Там описаны сущности для Author и Book как вы видите. В тестовом методе я пишу примерно вот такой код, в котором я пишу запрос, каким я должен вывести всех авторов, которые есть в списке авторов authors и написал книгу с определённым id:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
@Test
public void testRemoveAuthorsFromBookRecord(){
       
       /*em - entityManager и он объявлен. authors тоже.
        * rBook - сущность нужной книги, из которой я беру id
        * authors - просто набор объектов авторов типа Set, 
        * которые могут и не соответствовать ни одному из 
        * авторов, которые соответствуют записям о каких-либо книгах*/

       final String hql = "SELECT a FROM Author as a "+
                           "INNER JOIN a.books as b " +
                           "WHERE b.id = :book_id AND a IN ( :authors )";
        final Session session = em.unwrap(Session.class);
        Assert.assertNotNull(session);
        final Query query = session.createQuery(hql, Author.class)
              .setParameter("book_id", rBook.get().getId())
              .setParameterList("authors", authors);

        final List<Author> result = query.getResultList();

        /*** дальше идёт код чтения и вывод всех элементов на экран ***/

}



но такой код у меня почему-то падает в этом месте:

code linefinal List<Author> result = query.getResultList();

текст ошибки:

Код: plaintext
1.
java.lang.IllegalStateException: org.hibernate.TransientObjectException: 
object references an unsaved transient instance - save the transient instance before flushing: org.spring.learning.core.ioc.chapter1.Author

Я примерно знаю, что ошибка означает, что мой запрос возвращает сущности разных типов, а не одного уникального типа , а именно Author. Это если в общих чертах, но я не знаю, как исправить. Гугл не помог. В статьях, что он мне выдал советовали добавить в поле books сущности Authors кроме маппинга ещё свойство
Код: plaintext
cascase = CascadeType.ALL
и/или использовать ResultTransformer, но у меня не получилось ничего. Может быть вы знаете как сделать. Скажите как быть ???
...
Рейтинг: 0 / 0
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39746241
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DrillDrive,
Нарисуй схему классов.
Старайся использовать left join
...
Рейтинг: 0 / 0
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39746246
DrillDrive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123DrillDrive,
Нарисуй схему классов.
Старайся использовать left join
...
Рейтинг: 0 / 0
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39746248
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DrillDrive,
С inner я поторопился. Пусть будет.
Второе условие в where не лишнее?
...
Рейтинг: 0 / 0
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39746251
DrillDrive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Второе условие в where не лишнее?

нет. Нужно найти авторов, которые он написали конкретную книгу( это я определяю по точному номеру id уже в другом запросе) и он есть среди списка авторов( IN clause).
...
Рейтинг: 0 / 0
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39746254
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DrillDrivePetro123Второе условие в where не лишнее?

нет. Нужно найти авторов, которые он написали конкретную книгу( это я определяю по точному номеру id уже в другом запросе) и он есть среди списка авторов( IN clause).а ты попробуй.
Если искать по айди, то все другие условия уже не важны.
...
Рейтинг: 0 / 0
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39746260
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DrillDriveНужно найти авторов, которые он написали конкретную книгу( это я определяю по точному номеру id уже в другом запросе) и он есть среди списка авторов( IN clause).а по-русски?

Petro123Если искать по айди, то все другие условия уже не важны.+1
...
Рейтинг: 0 / 0
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39746303
DrillDrive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяDrillDriveНужно найти авторов, которые он написали конкретную книгу( это я определяю по точному номеру id уже в другом запросе) и он есть среди списка авторов( IN clause).
а по-русски?

Нужно найти авторов, которые написали конкретную книгу( книгу, которую я определяю по id уже в другом запросе) и они есть среди списка авторов( IN clause).

простите, что не сразу написал правильно, просто сообщения форум не можем переправлять, если оно уже отправлено.

Petro123а ты попробуй.
Если искать по айди, то все другие условия уже не важны.


Я так сделал. У меня сработало. Спасибо. Правда, если я убрал это второе условия у WHERE, все равно нужно сделать ещё проверку, что найденные авторы книги есть среди тех, что находятся внутри коллекции. Неужели мне придётся писать для этого третий запрос ???
...
Рейтинг: 0 / 0
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39746307
DrillDrive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DrillDriveЯ так сделал. У меня сработало. Спасибо. Правда, если я убрал это второе условия у WHERE, все равно нужно сделать ещё проверку, что найденные авторы книги есть среди тех, что находятся внутри коллекции. Неужели мне придётся писать для этого третий запрос ???

Просто у меня общее задание такое: написать метод, который удаляет набор авторов из определённой книги.
...
Рейтинг: 0 / 0
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39746394
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DrillDrive,

список авторов - это что ?
что у тебя подставляется в :authors ?
...
Рейтинг: 0 / 0
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39746405
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DrillDriveНужно найти авторов, которые написали конкретную книгу( книгу, которую я определяю по id уже в другом запросе) и они есть среди списка авторов( IN clause).
Если маппинг правильный то это:
Код: java
1.
2.
Книга кн = getКнига(id)
АвторыКниги список = кн.Авторы.


Проверяй.
...
Рейтинг: 0 / 0
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39746677
alex55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DrillDriveЯ примерно знаю, что ошибка означает, что мой запрос возвращает сущности разных типов, а не одного уникального типа
По ходу не знаешь.

Ошибка видимо говорит о том, что в пределах транзакции появились некие авторы, которые изначально растут из другой транзакции, в которой не сохранены.

То есть ты суёшь на вход список авторов, которых хибер вот так интерпретирует. Не знаю, откуда авторы, тебе там виднее, но копать надо в эту сторону.
...
Рейтинг: 0 / 0
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39746939
DrillDrive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяDrillDrive,

список авторов - это что ?
что у тебя подставляется в :authors ?

Я под этим подразумеваю коллекцию типа List<Author>. Её я и передаю в :authors

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
//книга, из которой берём id и заполняем авторами 

Book b = new Book("Война и мир");
        b.setPrice(new BigDecimal(78.67));
        b.getAuthors().add( new Author("Лев","Толстой"));

final List<Author>authors = book.
                getAuthors().
                stream().
                collect(Collectors.toList());

authors.add(new Author("Иван", "Мясников"));
...
Рейтинг: 0 / 0
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39746955
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DrillDrive,
Я не врубаюсь зачем тебе вторые авторы).
...
Рейтинг: 0 / 0
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39747339
pavel_nv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DrillDriveвадяDrillDrive,

список авторов - это что ?
что у тебя подставляется в :authors ?

Я под этим подразумеваю коллекцию типа List<Author>. Её я и передаю в :authors

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
//книга, из которой берём id и заполняем авторами 

Book b = new Book("Война и мир");
        b.setPrice(new BigDecimal(78.67));
        b.getAuthors().add( new Author("Лев","Толстой"));

final List<Author>authors = book.
                getAuthors().
                stream().
                collect(Collectors.toList());

authors.add(new Author("Иван", "Мясников"));



У тебя есть БД, с книгами и авторами.
Судя по всему из этого когда ты хочешь найти книги по авторам, которые в БД даже не сохранены.
Каким образом hibernate должен решить, по каким полям искать совпадение?
...
Рейтинг: 0 / 0
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39747363
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavel_nv,
Твоя догадка неверна. Не получится искать в короткой веб транзакции таких авторов..
...
Рейтинг: 0 / 0
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39747372
pavel_nv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

С чего это?
Допустим автор может написать за свою жизнь книг 100.
Т.е. найти 100 строк по индексу в современной БД за 30-100 мс не реально?


Посмотрел повнимательнее запрос:
Код: java
1.
2.
3.
final String hql = "SELECT a FROM Author as a "+
                           "INNER JOIN a.books as b " +
                           "WHERE b.id = :book_id AND a IN ( :authors )";


Так вообще найти авторов, которые из списка авторов, участвовали в написании определенной книги.

Если посмотреть внимательнее на ошибку
Код: java
1.
2.
java.lang.IllegalStateException: org.hibernate.TransientObjectException: 
object references an unsaved transient instance - save the transient instance before flushing: org.spring.learning.core.ioc.chapter1.Author


Так вообще ошибка в том, что либо сохраняют (передают в параметры) Book с несохраненными Author в коллекции, либо в параметр ":authors" передают несохраненных Author
...
Рейтинг: 0 / 0
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39747376
pavel_nv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS с Hibernate не работал, знаком только на уровне пролистывания доки
...
Рейтинг: 0 / 0
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39747393
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavel_nvPS с Hibernate не работал, знаком только на уровне пролистывания докикороткие в веб, это начало на post и коммит на выход. Это 0,01сек.
Так?
Кого там искать за это время без базы?
...
Рейтинг: 0 / 0
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39747410
pavel_nv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123pavel_nvPS с Hibernate не работал, знаком только на уровне пролистывания докикороткие в веб, это начало на post и коммит на выход. Это 0,01сек.
Так?
Кого там искать за это время без базы?

Что то я не понимаю Тебя...

Был изначально вопрос про хибернейт.
Логично, если передавать объект в качестве параметра, то искать он будет по полю ключа (@Id)
Если объект параметра не сохранен - то получаем ошибку.
Никаких требований про 10мс не было.

Зачем притягивать "поиск без базы за 0,01сек" к теме про Hibernate?
...
Рейтинг: 0 / 0
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39747418
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavel_nv,
Ты не знаешь хибер и подумал что запрос не к базе.
Так?
Я сказал что запрос именно к базе. Иначе нельзя.
Все.
...
Рейтинг: 0 / 0
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39747424
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DrillDrive,
Код: sql
1.
SELECT a FROM Author


что такое а
...
Рейтинг: 0 / 0
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39747429
pavel_nv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123pavel_nv,
Ты не знаешь хибер и подумал что запрос не к базе.
Так?

Я сказал
pavel_nvСудя по всему из этого когда ты хочешь найти книги по авторам, которые в БД даже не сохранены.

Другими словами: найти по параметрам (объекты класса Author), которые в БД не сохранены (не имеют ID).

С базами я знаком)
...
Рейтинг: 0 / 0
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39747449
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavel_nv,
Нельзя в одном where обращаться и к сохраненным и к нет.
...
Рейтинг: 0 / 0
hibernate exception: не удаётся вернуть запрос из джойнов.
    #39747451
DrillDrive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяDrillDrive,
Код: sql
1.
SELECT a FROM Author


что такое а

a - это объект-сущность Author со всеми полями. Т.е. я прошу select запрос вернуть значения всех колонок таблицы, относящиеся к полям объекта Authors.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate exception: не удаётся вернуть запрос из джойнов.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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