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

Spring Data Jpa项目使用多人关系时的生成查询

太叔鹏云
2023-03-14

我有以下实体映射:

@Entity
@Table(name = "books")
public class Book implements Serializable {
    @ManyToMany
    @JoinTable(name="books2categories",
    joinColumns=@JoinColumn(name="book_id"),
    inverseJoinColumns=@JoinColumn(name="category_id"))
    Collection<Category> categories;

...

@Entity
@Table(name = "categories")
public class Category implements Serializable {
    @ManyToMany(mappedBy="categories")
    private Collection<Book> books;

BookRepository界面如下:

public interface BookRepository extends JpaRepository<Book, Long> {

    @Query("SELECT b FROM Book b INNER JOIN b.categories c WHERE c IN (:categories)")
    List<Book> findByCategories(Collection<Category> categories);

如果我在查询本身中出错,请修复我。当我为findByCategories方法运行测试时,我得到了错误:

testFindByCategories(com.savdev.springmvcexample.repository.JpaBookRepositoryTest):org。冬眠QueryParameterException:位置超出声明的序数参数的数量。请记住,序数参数是基于1的!位置:1;嵌套的异常是java。lang.IllegalArgumentException:org。冬眠QueryParameterException:位置超出声明的序数参数的数量。请记住,序数参数是基于1的!位置:1

我必须解决它的哪个选项?

第二,我可以调试将参数传递到查询中的Spring数据Jpa逻辑吗?我得到了一个由Spring Data Jpa返回的代理,无法理解在哪里使用断点来调试此行为。

更新:我已经通过使用(?1)修复了它:

@Query("SELECT b FROM Book b INNER JOIN b.categories c WHERE c IN (?1)")

而不是

@Query("SELECT b FROM Book b INNER JOIN b.categories c WHERE c IN (:categories)")

共有2个答案

傅志文
2023-03-14

您可以直接使用JPA命名约定来解决该问题。

<代码>列表

希望对解决问题有所帮助。

范飞翰
2023-03-14

由于参数名在字节码中丢失,因此需要使用@Param注释来指示在JPQL中映射为:category变量的参数。因此,您的代码如下所示:

@Query("SELECT b FROM Book b INNER JOIN b.categories c WHERE c IN (:categories)")
List<Book> findByCategories(@Param("categories") Collection<Category> categories);

?1当然有效,但可能不那么可读。

 类似资料:
  • 我有一个多项目分级构建,我想应用其中一个子项目作为所有其他子项目的依赖项。 也就是说,如果我指定:

  • 我做了以下工作: 使用activator命令创建了一个新项目:activator new play java 但是,由于软件包的运行,我无法构建该项目。*组织。idea中未识别/导入junit等。不过,我可以毫无问题地执行“activator run”。如果我执行“activator idea”,我会收到以下错误消息: 当我导入这里定义的websocket示例时https://devcenter.

  • 什么是查询以获取所有图书的作者姓名?还有什么是查询得到所有的书的名字为作者的名字?

  • 生成的子实体映射器方法(缺少setChildren或,在我的例子中): 如何让映射器在子级中设置父级?

  • 问题内容: 我想了解Doctrine和Symfony2的多对多关系是如何工作的。 我已经重新创建了官方文档(goo.gl/GYcVE0)中显示的示例,并且我有两个实体类: 用户 和 组 ,如下所示。 如果我更新数据库,则会得到以下MySQL模式: 问题在于,在Symfony2中,我需要 实体 来生成查询,在这种情况下,我没有与表相关联的实体,因为该表是由框架自动创建的。 那么,如何检索与此关系表有

  • 我有什么似乎是一个简单的问题,关于如何设置Jenkins和maven 3。 为了简单起见,假设我们有四个项目: 没有依赖关系的模型 Commons依赖于模型 服务器依赖于Common和模型 前端依赖于模型 我想要实现的是,一个成功的基于模型的构建触发所有项目的新构建,这些项目在其pom中依赖于模型(这里是公共的,服务器和前端) 如果Common失败,则无需构建服务器。 在上述情况下,我似乎可以通过