首页 > 解决方案 > 带有自定义查询和自定义响应对象的 Spring JPA 规范 API。这可能吗?

问题描述

我已经研究了几天,但似乎找不到正确的信息。

这就是我需要的,我有一个数据库,有多个表,我需要将几个表连接在一起以制作一种“搜索”API。我必须实现动态搜索字段(来自查询中的各种表)、可排序、分页的能力。

我发现我无法将@Query注释与规范 API 结合起来,我研究了使用规范 API 来执行我需要的连接,但是问题是根必须是一个表/存储库。

例如:

如果我有一个用户表必须加入地址、电话号码和首选项

基本存储库将是 UserResposiory ,它将返回用户实体模型,但我需要它来返回自定义 DTO

AccountUserDTO,其中包含来自 User、Address、PhoneNumber 和 Preference 实体的字段。

有人知道这是否可能吗?

我在这里束手无策,我真的想以正确的方式构建它。

干杯!

标签: spring-data-jpacriteria-api

解决方案


你可以这样做:

将 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 中创建自己的视图并将其映射到一个实体。


推荐阅读