java - Postgres & JPA 命名查询 - WHERE 中的任何 (*) 值
问题描述
我想为一些特定的 GET 案例编写过滤器查询。
我现在正在做的是为每个案例编写单独的查询,这非常耗时。相反,我想编写一个大的命名查询,如果设置了过滤器,我可以在 WHERE 子句中输入一个值,否则为 ANY。JPA可以做到这一点吗?这是一个示例控制器,它通过特定的客户端 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)]
实现这一目标的最佳方法是什么?我必须编写本机查询还是有命名查询的方法?
编辑以澄清:上面的示例显示了一个带有 type 的查询Long
,但我也需要这样做String
。
解决方案
您可以尝试更改您的查询,例如:
WHERE (i.clientContractData.client.id = :clientId or :clientId = -1)
注意:我认为 JPA 中的引用可以达到 2 个级别,这里有 3 个级别:
i.clientContractData.client.id
您可能需要在此处使用额外的显式连接
推荐阅读
- javascript - 表单输入未更新 API 获取
- ethereum - 以太坊 - 更新配置属性
- python-3.x - 错误信息 FileNotFoundError: [Errno 2] No such file or directory
- c++ - 以度为单位定义一个 boost::units 角度
- c - 无法解决 Visual Studio 中的 LNK 2001 错误
- react-native - Appium desktop v1.20.0 iOS 看不到基于 react-native 构建的屏幕子组件中的元素及其 id?
- reactjs - 如何使用 Jest 部分模拟自定义反应钩子?
- android - 在 Android 11 中将文件从外部存储复制到内部存储
- installation - 在 Windows 7 上安装 Python 3.8.10 的 TA-Lib 包时遇到问题
- c# - 在 RestSharp 和 C# 中解析 JSON 内容时出错