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

2022-09-01 07:57:53

我尝试用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。我找不到错误。


答案 1

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

查询:

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
}

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


答案 2

在不详细介绍如何建模和应该建模的情况下,我至少会解释为什么你会得到这个例外。MediaBook

你正在做:

em.createQuery(someJPQL, Media.class);

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

但你是:JPQL

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

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

select m from Media m ...

推荐