我正在使用 Spring MVC 和 Hibernate 编写一个应用程序,正在研究它。我有 12 个变量的对象 Person。任务是从数据库中找到与可比对象最匹配的现有对象 Person。例如 inputPerson_1 匹配 databasePerson_423 的 9 个变量是 75% 匹配。
我有以下想法,但它看起来对数据库来说非常过载,而且显然是一个薄弱的解决方案:
1) 对 MySQL 创建 12 个连续查询以收集所有可能的匹配对象并保存到 HashSet,其中第一个参数将是 Person ID
query = session.createQuery("from Person where lower(firstName) like :inputFirstName)
query = session.createQuery("from Person where lower(lastName) like :inputLastName)
...
2) 创建 int max 并逐一比较 HashSet 中对象的变量。返回匹配度最高的对象。
最好的选择是什么?也许有一些现成的解决方案?
最佳答案
我只会执行一个数据库查询,该查询会搜索是否有任何属性匹配。
然后我会编写一个函数,为每个人计算有多少属性匹配并返回最佳匹配值。
然后您可以为您的最佳匹配值排序列表。
当然,解决问题的方法有无数种,每种方法都有自己的优点和缺点。
因此,以下是我建议的解决方案的优缺点:
专业人士:
- 您与数据库的交互较少。 => 它应该比答案中的解决方案更快。
- 您对最佳匹配的计算非常灵活。这是一个功能,您可以在其中检查和计算您想要的一切。
缺点:
您在不同的地方有两个部分必须同步。搜索所有条件的数据库查询和检查相同属性的计算功能。 => 隐藏契约和耦合
如果搜索条件将返回大量条目,则此解决方案不适合。然后你必须以某种方式计算数据库中的因子,你需要使用与顺序和限制一起工作的索引,所以你不会返回所有行并且有一个 O(log(n)) 的努力类。
关于java - Java + Hibernate中对象的匹配算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49338523/