【问题标题】:Spring. Creating a custom search based on wildcards春天。基于通配符创建自定义搜索
【发布时间】:2013-06-07 19:07:45
【问题描述】:

我是 Spring 新手,虽然我的问题可能看起来不成熟。

这是我一直陷入的一个大障碍。我正在尝试选择正确的方法来实现基于通配符的搜索逻辑,无论是选择 JDBC、Hibernate 还是 JPA 和存储库。

我将演示这个问题。假设我们在网页中有一个搜索表单,有人可能会在其中进行查询以检索 FirstName 和 LastName,并说例如有记录:

  • “弗雷德·弗雷德里克森”
  • “阿尔伯特詹姆逊”
  • “沃森达尔博特”

可以使用 *alb* 之类的东西,我们应该得到:

  • “阿尔伯特詹姆逊”
  • “沃森达尔博特”

或者使用 ????son 我们希望只得到“Albert Jameson”。

学习Spring我发现“like”子句可能只是硬编码的,比如:

@Query("select u from User u where u.firstname like %?1") 列出 findByFirstnameEndsWith(String firstname);

如果使用 JPA 存储库。

我希望我的问题更清楚了。

非常感谢您提供任何帮助或相关建议。

【问题讨论】:

  • MySQL(我相信其他 SQL 兄弟)具有基于正则表达式搜索事物的能力。我认为您不想在 Java 中重新发明轮子。
  • 是的,MySql 本身就有这种能力,但是,你应该,比如说,硬编码 Java 中的所有方法,比如“findByFirstName”或“findById”或类似的东西。我可能错了......我们如何调整java中的方法从搜索表单中获取通配符?

标签: java spring search wildcard sql-like


【解决方案1】:

我会在以下示例中使用 JPA

@NamedQuery(name="Profile.getPerson", query="SELECT u FROM User u WHERE u.firstName LIKE ?1");

Query query = session.getNamedQuery("Profile.getPerson");
query.setParameter(1, patternYouWant);        
query.getResultList();

【讨论】:

  • 但是“patternYouWant”也是硬编码的,我们如何预测所有情况,比如:“*alb”、“alb*”、“alb???”等等……
  • patternYouWant 是参数化的,因此您可以在 Web 表单上捕获您想要的模式,并在您的代码隐藏中使用您在表单上指定的模式运行名称查询。我希望我能理解你想要实现的目标
  • 是的,Ashish,你理解正确。非常感谢您指出合适的方向......我现在要试试。
猜你喜欢
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-18
  • 2017-04-15
  • 2011-09-19
  • 2021-11-16
  • 1970-01-01
相关资源
最近更新 更多