动态(复杂)查询 JPA/Hibernate 上的动态参数
Posted
技术标签:
【中文标题】动态(复杂)查询 JPA/Hibernate 上的动态参数【英文标题】:Dynamic parameters on dynamic (complex) query JPA/Hibernate 【发布时间】:2021-12-06 20:35:51 【问题描述】:我正在尝试构建一个涉及过滤的复杂查询,我在 JDBC 上这样做了:
private String buildFilteredQuery(List<Long> extensions, List<Long> categories, Long courseId)
...
StringBuilder extensionQuery = new StringBuilder();
if (!extensions.isEmpty())
extensionQuery.append("AND (");
extensions.forEach(e -> extensionQuery.append("fileExtensionId = ? OR "));
extensionQuery.delete(extensionQuery.length() - 4, extensionQuery.length());
extensionQuery.append(")");
...
问题是现在通过 JPA 我不能真正做到这一点,因为而不是 ?我应该把要映射的变量(例如 :fileExtension )
那么我该如何构建一个动态查询呢?
【问题讨论】:
您可以使用 JPA Criteria API 动态构建请求,但对于这个特定示例,我认为使用IN
子句会更容易
是的,我最终为此使用了 in,我不知道为什么我什至试图连接所有这些 OR 子句老实说,我会发布我的解决方案。
【参考方案1】:
就像@Guillaume 所说,我最终只使用了一个带有 IN 子句的语句:
private String buildFilteredQuery(List<Long> extensions, List<Long> categories, Long courseId)
...
StringBuilder query = new StringBuilder();
if (!extensions.isEmpty()) query.append("AND ( fileExtensionId IN ( :extensionIds ) ) ");
...
【讨论】:
以上是关于动态(复杂)查询 JPA/Hibernate 上的动态参数的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot JPA+Hibernate 在 SaveAll() 上的低性能
Spring Data JPA + Hibernate 将方法标记为事务
JPA/Hibernate:在复杂类上使用 AttributeConverter 时创建 UserType 是不是显而易见?