У меня есть объекты:
@Entity
public class Author{
@ManyToMany(cascade = { CascadeType.ALL })
@JoinTable(
name = "author_book",
joinColumns = { @JoinColumn(name = "author_id") },
inverseJoinColumns = { @JoinColumn(name = "book_id") }
)
public List<Book> books;
}
@Entity
public class Book{
@ManyToMany(mappedBy = "books")
public List<Author> authors;
@OneToMany(mappedBy = "book")
public List<Fact> facts;
public Book(){}
public Book(List<Author> authors, List<Fact> facts){
this.authors = authors;
this.facts = facts;
}
}
@Entity class Fact{
@ManyToOne
@JoinColumn(name="book_id")
public Book book;
}
В книге больше авторов, и авторы могут писать больше книг.В каждой книге есть больше фактов об этом, и каждый акт принадлежит только одной книге.
Теперь я хочу получить объект типа Book
на основе идентификатора автора.Объект типа Book
должен содержать всех авторов и все факты.
Я использую запрос гибернации для этого:
List<Book> books = (List<Book>) session.createQuery("Select new Book (books.authors, books.facts ) FROM Author u JOIN u.books books JOIN books.facts WHERE u.id IN :ids ").setParameter("ids", authorId).list();
Однако это приводит к ошибке:
Невозможно найти соответствующий конструктор в классе [Book].Ожидаемые аргументы: java.util.Collection, java.util.Collection
Я попытался настроить конструктор так, чтобы он брал объект или коллекцию и сам приводил его:
public Book(Object authors,Object facts){
this.authors = (List<Author>)authors;
this.facts = (List<Fact>)facts;
}
Но это жалуется:
org.hibernate.exception.SQLGrammarException: не удалось извлечь ResultSet
Каков правильный способ получения сущности с требуемыми данными тогда?Жалуется только на отношения (например, коллекции), я нигде не нашел решения для этого (ни документации для hql).
Спасибо за помощь!