动态(复杂)查询 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 是不是显而易见?

Jpa , Hibernate 选择查询优化

JPA,Hibernate,ibatis(mybatis)如何选用?

JPA/Hibernate 本机查询无法识别参数