当前位置: 首页 > 知识库问答 >
问题:

用Spring JPA规范实现多列搜索

太叔富
2023-03-14

我想在Spring-Boot后端创建一个多字段搜索。如何使用规范 实现这一点?

环境

Springboot
Hibernate
Gradle
Intellij

前端的UI是Jquery DataTable。每列允许应用单个字符串搜索项。跨多个列的搜索词由联接。

public interface SomeRepository extends JpaRepository<Some, Long>, PagingAndSortingRepository<Some, Long>, JpaSpecificationExecutor {

看来QueryDSL是解决这个问题的更简单、更好的方法。我在用Gradle。我需要改变我的构造吗?

共有1个答案

谭绍晖
2023-03-14

如果您不想使用QueryDSL,则必须编写自己的规范。首先,您需要像以前那样从JPaspecificationExecutor扩展存储库。但请确保添加泛型(JPaspecificationExecutor )。

之后,您必须创建三个规范(每个列一个),在Spring文档中,他们将这些规范定义为类中的静态方法。基本上,创建规范意味着您必须对规范 进行子类化,它只有一个方法可以实现,topredicate(Root ,CriteriaQuery ,CriteriaBuilder)

如果使用Java8,可以使用lambdas创建匿名内部类,例如:

 public class SomeSpecs {
     public static Specification<Some> withAddress(String address) {
          return (root, query, builder) -> {
               // ...
          };
     }
 }
 public class SomeSpecs {
     public static Specification<Some> withAddress(String address) {
          return (root, query, builder) -> builder.equal(root.get("address"), address);
     }
 }

或者,如果要使用(如)查询,可以使用:

public class SomeSpecs {
     public static Specification<Some> withAddress(String address) {
          return (root, query, builder) -> builder.like(root.get("address"), "%" + address + "%");
     }
 }

现在,您必须对其他要筛选的字段重复此操作。之后,您必须一起使用所有规范(使用和()或()、...)。然后可以使用repository.findAll(Specification)方法根据该规范进行查询,例如:

public List<Some> getSome(String address, String name, Date date) {
    return repository.findAll(where(withAddress(address))
         .and(withName(name))
         .and(withDate(date));
}

您可以使用静态导入来导入WithAddress()WithName()WithDate(),以便于阅读。where()方法也可以静态导入(来自specification.where())。

public List<Some> getSome(String address, String name, Date date) {
    return repository.findAll(where(address == null ? null : withAddress(address))
         .and(name == null ? null : withName(name))
         .and(date == null ? null : withDate(date));
}
 类似资料:
  • 我正在回答这个问题,在单个表的日期、整数和字符串数据类型字段上执行多列搜索?并且该方法必须返回Java 8中类型specification 的结果。 实际上,我想在关联实体中搜索,以及全局搜索的一部分。使用是否可能? 我有和@onetomany关系。 EmployeeController.java java 当我点击时,我希望在表和表中进行搜索(可能使用类似)。这可能吗?如果是,我们怎么做? 有什

  • 我有一个带有枚举列的实体: 其中枚举声明如下所示: 我尝试实施搜索规范: 我得到一个错误: 登上塔斯克斯塔斯。2769df0841;嵌套异常为java。lang.IllegalArgumentException:BoardingTaskStatus上没有枚举常量。2769df0841]具有根本原因java。lang.IllegalArgumentException:BoardingTaskStat

  • 本文档是一个正在进展的工作,在具体实现过程中将会有所改变。实现者应该意识到这个规范是不稳定的。目前缺少一些关于 meta 属性的细节和更精确的关于关联的细节。 此规范是在 GitHub repository 上完成。因此你可以帮助我们更新此规范,或者如果你想写一个关于此规范的具体实现,告诉我们哪些地方描述的可能存在歧义。最好的方式就是提交 Issue。

  • 我正在尝试将查询转换为JPA规范,该查询包含带OR条件的连接操作。 以下是查询: 我试图编写一个规范,但在如何将多个列与OR条件连接方面遇到了障碍。 用户实体: 运营实体 我希望有一个规范来取代上面的查询

  • 本文向大家介绍Vue实现搜索 和新闻列表功能简单范例,包括了Vue实现搜索 和新闻列表功能简单范例的使用技巧和注意事项,需要的朋友参考一下 效果图如下所示: 总结 以上所述是小编给大家介绍的Vue实现搜索 和新闻列表功能简单范例,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐喊教程网站的支持!

  • 我了解批次归一化有助于更快的训练,将激活转向单位高斯分布,从而解决梯度消失问题。批次规范行为在训练(使用每个批次的平均值/var)和测试时间(使用训练阶段的最终运行平均值/var)中的应用不同。 另一方面,实例归一化作为对比度归一化,如本文所述https://arxiv.org/abs/1607.08022。作者提到,输出样式化的图像不应依赖于输入内容图像的对比度,因此实例规范化有助于实现。 但是