我有实体:
@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;
}
书有更多的作者,作者可以写更多的书。每本书都有更多关于它的事实,每一个行为只属于一本书。
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;
}
您不能将新运算符与实体一起使用!
这是用于DTO(数据传输对象)投影的。
在您的例子中,您甚至不需要新的,因为您可以简单地选择将由Hibernate使用默认构造函数并设置字段构建的book。
List<Book> books =
(List<Book>) session.createQuery(
"Select books FROM Author u JOIN u.books books JOIN books.facts WHERE u.id IN :ids ")
.setParameter("ids", authorId).list();
List<Book> books =
(List<Book>) session.createQuery(
"Select b FROM Book b JOIN FETCH b.authors a JOIN FETCH b.facts f WHERE a.id IN :ids ")
.setParameter("ids", authorId).list();
Hibernate无法急切地获取两个列表。在这里,我建议将列表更改为集合:
@ManyToMany(mappedBy = "books")
public Set<Author> authors;
@OneToMany(mappedBy = "book")
public Set<Fact> facts;
问题内容: 当我尝试执行此HQL以返回对象时,出现此错误: 错误[org.hibernate.hql.PARSER](http- localhost-127.0.0.1-8080-2)无法在类[br.com.cdv.model.entity.Ponto]上找到适当的构造函数[原因= org.hibernate。 PropertyNotFoundException:类中没有适当的构造函数:br.co
当我尝试只使用Id作为值并删除列表时,它工作了。
问题内容: 假设我要编写以下HQL查询: 将其编写为参数化查询的正确方法是什么,例如 问题答案: 我不确定如何使用位置参数来执行此操作,但是如果可以使用命名参数而不是位置参数,则可以将命名参数放在方括号内,并且可以使用Query接口中的setParameterList方法将值列表绑定到此参数。
问题内容: 我正在尝试编写一个程序,该程序采用不同形状的地毯,并使用子类中定义的某些变量创建地毯对象。我的代码是 而子类是 但是每当我尝试编译子类时,都会出现错误 我不确定该如何解决。 问题答案: 由于您的超类没有子类,因此您需要使用 super() 从子类构造函数中显式调用您的超类构造函数。这不必是子类构造函数的第一行。 一个建议: 遵循Java命名约定,变量名称应为camelCase。即,在这
我正在尝试编写一个程序,该程序采用不同形状的地毯,并使用子类中定义的某些变量创建地毯对象。我的代码是 子类是 但每当我试图编译子类时,我都会遇到错误 我不知道该怎么修理它。
最近,我将Paho MQTT Spy项目导入Eclipse。导入结束时出现错误: 为什么我会收到这条信息,这意味着什么?怎么修? 我正在使用Java13.0.1 我试图用maven构建项目,得到了同样的错误。 我添加了下面的依赖项到pom.xml 现在pom.xml如下所示: Maven给出了错误: UPD Java8解决了问题,但我仍然试图使java 13与它一起工作。 正在尝试使用下面定义的p