【问题标题】:Spring JPA Specification API with custom Query and custom response Object. Is this possible?带有自定义查询和自定义响应对象的 Spring JPA 规范 API。这可能吗?
【发布时间】:2020-06-25 03:14:17
【问题描述】:

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

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

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

例如:

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

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

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

有人知道这是否可能吗??

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

干杯!

【问题讨论】:

    标签: spring-data-jpa criteria-api


    【解决方案1】:

    你可以这样做:

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

    【讨论】:

      猜你喜欢
      • 2018-09-15
      • 1970-01-01
      • 2019-03-10
      • 2015-02-02
      • 2015-03-25
      • 2015-12-07
      • 2018-04-27
      • 2016-04-15
      • 2017-11-15
      相关资源
      最近更新 更多