当前位置: 首页 > 知识库问答 >
问题:

在hql查询中使用新的构造函数无法找到正确的consturctor或无法提取ResultSet

易衡
2023-03-14

我有实体:

@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;
   }

共有1个答案

黄朗
2023-03-14

您不能将新运算符与实体一起使用!

这是用于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