spring-data-jpa - 带有自定义查询和自定义响应对象的 Spring JPA 规范 API。这可能吗?
问题描述
我已经研究了几天,但似乎找不到正确的信息。
这就是我需要的,我有一个数据库,有多个表,我需要将几个表连接在一起以制作一种“搜索”API。我必须实现动态搜索字段(来自查询中的各种表)、可排序、分页的能力。
我发现我无法将@Query
注释与规范 API 结合起来,我研究了使用规范 API 来执行我需要的连接,但是问题是根必须是一个表/存储库。
例如:
如果我有一个用户表必须加入地址、电话号码和首选项
基本存储库将是 UserResposiory ,它将返回用户实体模型,但我需要它来返回自定义 DTO
AccountUserDTO,其中包含来自 User、Address、PhoneNumber 和 Preference 实体的字段。
有人知道这是否可能吗?
我在这里束手无策,我真的想以正确的方式构建它。
干杯!
解决方案
你可以这样做:
将 hql 查询构建为字符串,取决于过滤条件如何请求,可以构建相应的查询,例如:
if (hasParam(searchName)) {
queryString = queryString + " myEntity.name = :queryName"
}
Query query = session.createQuery(queryString);
和提供的参数
if (hasParam(searchName)) {
query.setParameter("queryName", searchName);
}
...
and execute it.
要创建自定义对象,最简单的方法是将对象视为字段数组:
Query query = session.createQuery("select m.f1, m.f2, m.f3 from myTable m");
List managers = query.list();
Object[] manager = (Object[]) managers.get(0); //first row
System.out.println(manager[0]) //f1
System.out.println(manager[1]) //f2
System.out.println(manager[2]) //f3
还有一些其他的解决方案可供选择,例如
String query = "select new mypackage.myclass(m.f1, m.f2, m.f3) from myTable m";
-> 当执行上述查询时,它会返回一个对象列表。
或者更简单地说,在 db 中创建自己的视图并将其映射到一个实体。
推荐阅读
- python - 所有可能的整数集,总和为零
- azure-devops - 如何在 Azure Build 上重新启动 ubuntu 代理?
- mysql - MySql - 如何根据加入另一个表的多个值从一个表中选择行
- sql - 多个内连接和子查询的查询优化
- javascript - Express.js:TypeError:res.sendFile 需要路径参数
- android - 所有现有项目的 Android Things 控制台将于 2022 年 1 月 5 日关闭
- json - 使用 ArduinoJson 库无法使用 JsonObject 解析 Json
- mongodb - .Net核心字典中的Mongodb $inc运算符
- uml - 支付场景用例图
- javascript - 上传文件,axios 工作,但 fetch API 没有,我做错了什么?