java - 多对多实体上的 JPA WHERE 子句
问题描述
我有两张桌子,书本和流派。每本书可能有多种流派,多对多表只包含书本 ID 和流派 ID。我想创建一个过滤器,它可以按类型过滤书籍。
@JoinTable(name = "bookGenre", joinColumns = {
@JoinColumn(name = "bookId", referencedColumnName = "id")}, inverseJoinColumns = {
@JoinColumn(name = "genreId", referencedColumnName = "id")})
@ManyToMany
private Collection<Genre> genreCollection;
流派类:
@Id
@Basic(optional = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@Size(max = 255)
@Column(name = "name")
private String name;
@Column(name = "status")
private Integer status;
@ManyToMany(mappedBy = "genreCollection")
private Collection<Book> bookCollection;
这是我试图在 JPA 上执行的查询:
SELECT b.title FROM book b
JOIN bookGenre bg on bg.bookId = b.id
JOIN genre g on bg.genreId = g.id
WHERE g.id = 1
--Filter books that have genre with id 1
我在 JPA 上尝试了以下方法:
SELECT b FROM Book b WHERE b.genreCollection.id = 1
但它给了我以下错误:“状态字段路径'b.genreCollection.id'无法解析为有效类型。”
编辑:我发现我可以使用带有内置结果集映射到 Book POJO 的本机 sql 查询EntityManager.createNativeQuery(query, Book.class)
。所以我只是使用它并将我的查询与 StringJoiner 串在一起。
解决方案
我认为您的 JPA 查询应该是
SELECT b FROM Book b INNER JOIN b.genreCollection g WHERE g.id = 1
推荐阅读
- python - 无法正确生成 Numpy FFT
- vue.js - 如何在具有特定类的特定单元格之前/之后添加类或突出显示所有单元格?
- php - 使用/扩展 Doctrine 实体
- java - Java - 'throws' 子句中没有从正文中抛出的异常
- c++ - 将 boost::strand 包装的处理程序存储在数组中
- python - 如何使用 python 处理自定义 404 页面
- php - 上传文件到服务器
- python - 如何在 Python 中的函数内填充全局数组?
- python - Django 和 Celery:计划任务正在运行,但似乎什么也没做
- java - smartgwt 是否支持一个 HTTP 调用上的多个记录更新