java - Postgres 和 JPA 命名查询 - WHERE 中的任何 (*) 值

标签 java postgresql jpa orm named-query

我想为某些特定的 GET 案例编写过滤器查询。

我现在正在为每个案例编写单独的查询,这非常耗时。相反,我想编写一个大的命名查询,如果设置了过滤器,我可以在其中将一个值放入 WHERE 子句,否则任何。 JPA可以吗? 这是一个示例 Controller ,它通过特定的客户端 ID 返回付款:

public List<PaymentEntity> findAllByClientId(final int page, final int pageSize, final String fromDate,
        final String toDate, final Long clientId) {
    Map<String, Object> parameters = new HashMap<>();
    parameters.put("clientId", clientId);
    return super.findWithNamedQueryPagination("PaymentEntity.findAllWithPaginationByClientId", parameters,
            PaymentEntity.class, page, pageSize, fromDate, toDate);
}

这是所属的命名查询:

SELECT i FROM PaymentEntity i WHERE i.clientContractData.client.id = :clientId AND i.createdAt BETWEEN :fromDate AND :toDate ORDER BY i.createdAt DESC

我现在想要的是能够像这样传递一个参数:

    if(clientId == null) {
        parameters.put("clientId", "*");
    } else {
        parameters.put("clientId", clientId);
    }

但现在我当然会收到一个类型错误:Parameter value [*] did not match expected type [java.lang.Long (n/a)]

实现此目标的最佳方法是什么?我必须编写 native 查询还是有命名查询的方法?

编辑以澄清:上面的示例显示了类型为 Long 的查询,但我也需要使用 String 来执行此操作。

最佳答案

您可以尝试像这样更改您的查询:

WHERE (i.clientContractData.client.id = :clientId or :clientId = -1)

注意:我认为 JPA 中的引用深达 2 层,这里有 3 层:

i.clientContractData.client.id

你可能需要在这里使用额外的显式连接

关于java - Postgres 和 JPA 命名查询 - WHERE 中的任何 (*) 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56513420/

相关文章:

java - GSSException 创建凭证

javascript - 如何在旧版 Java Web 应用程序中捆绑 js/css

java - java中的计算器错误

postgresql - 为什么添加 JOIN 会完全修改查询规划器的行为?

java - JPA 关系可能性

java - 将 Oracle Date 映射到 Java 类型以返回自纪元以来的秒数?

postgresql - 如何识别禁用真空的表

java - Postgres - 杀死未提交的事务

java - 有没有办法正确生成多个模式的 JPA 实体?

java - 避免在 RESTful Web 服务中加载整个对象图