错误:无法为具有多个返回值的查询创建 TypedQuery

新手上路,请多包涵

我尝试用 java 和 jpa 做函数 searchBook。我有 2 个类,即媒体和书籍。书扩展媒体。我将数据保存在不同的表中。我尝试从以下查询中选择数据:

 TypedQuery<Media> query = em.createQuery(
                "SELECT m.title, b.isbn, b.authors"
                        + " FROM Book b, Media m" + " WHERE b.isbn = :isbn"
                        + " OR lower(m.title) LIKE :title"
                        + " OR b.authors LIKE :authors", Media.class);
        query.setParameter("isbn", book.getisbn());
        query.setParameter("title", "%" + book.getTitle().toLowerCase()
                + "%");
        query.setParameter("authors", "%" + book.getAuthors() + "%");
        bookList = query.getResultList();

但我得到了错误:

java.lang.IllegalArgumentException:无法为具有多个返回值的查询创建 TypedQuery

这是我第一次使用 JPA。我找不到错误。

原文由 user1412944 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 518
2 个回答

无需详细说明 MediaBook 应该如何建模,我至少会解释为什么会出现此异常。

你正在做的:

 em.createQuery(someJPQL, Media.class);

这意味着:使用 someJPQL 创建查询,该查询将返回 Media 实体的实例。

但是你的 JPQL 是:

 SELECT m.title, b.isbn, b.authors ...

因此查询不会返回媒体类型的实体。它从两个不同的实体返回三个字段。您的 JPA 引擎无法从这 3 列神奇地创建 Media 实例。如果它看起来像这样,查询将返回 Media 的实例:

 select m from Media m ...

原文由 JB Nizet 发布,翻译遵循 CC BY-SA 3.0 许可协议

作为解决方法,要获取由其他实体属性组成的实体,您可以在查询中创建它,并为其提供构造函数。

询问 :

 TypedQuery<Media> query = em.createQuery("SELECT NEW package_name.Media(m.title, b.isbn, b.authors)"
+ " FROM Book b, Media m"
+ " WHERE b.isbn = :isbn"
+ " OR lower(m.title) LIKE :title"
+ " OR b.authors LIKE :authors", Media.class);

实体 :

 public Media(String title, int isbn, String author){

    //-- Setting appropriate values
}

我提供了示例,相应地更改构造函数的数据类型。

原文由 Nayan Wadekar 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题