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

按多列查找

索嘉胜
2023-03-14

我想执行如下查询:

SELECT * FROM table WHERE
col1 = 'value1' OR
col2 = 'value2' OR
col3 = 'value3' OR
col4 = 'value4';

使用Spring的JpaRepository我应该使用这样的东西:

List<MyEntity> findByCol1OrCol2OrCol3OrCol4(
  String col1, String col2, String col3, String col4
);

现在想象一下,我不想检查4列,而是检查10或20列,方法名会很长!

我在这个答案中看到,我可以使用规范在许多列中搜索相同的文本,但我希望每个列都有不同的文本值。

有什么方法可以缩短find方法并动态添加列(以及相应的值)吗?

谢谢

共有1个答案

卫彭亮
2023-03-14

这可以通过规范和地图(属性名称、值)来实现。代码示例(适用于任何数据):

Map<String, Object> whereClause = new HashMap<>();
whereClause.put("lastname", "Super-Lastname");
whereClause.put("firstname", "Firstńame");

userRepository.findOne(Specifications.where(
    CommonSpecifications.attributesEquals(whereClause))
)

public static <T> Specification<T> attributesEquals(Map<String, Object> whereClause) {
    return (root, query, builder) -> builder.or(root.getModel().getDeclaredSingularAttributes().stream()
            .filter(a -> whereClause.keySet().contains(a.getName()))
            .map(a -> builder.equal(root.get(a.getName()), whereClause.get(a.getName())))
            .toArray(Predicate[]::new));
}
 类似资料:
  • 我用的是拉威尔的背包,积垢舱。 如何将orderby()用于多列? 例子: 我看到src和orderby只接受一个参数。 有什么建议吗?

  • 问题内容: 请帮我这个: 我想按列TestType分组,但如果它们具有相同的TestType,则应将Result拆分为colunms 我希望SQL以这种格式返回数据 Result#列应该是动态的,因为每个TestType都有很多结果 问题答案: 正如我在评论中所提到的,这里您需要的是或交叉标签;我更喜欢后者,所以我将要使用的东西。 对此的非动态解决方案如下: 但是,问题在于这会将您“锁定”到3个结

  • 问题内容: 我正在研究像亚马逊这样的产品过滤器(多面搜索)。我有一个具有属性(颜色,内存,屏幕)的表,如下所示: 我必须根据选择的属性来选择文章。您可以为一个属性选择多个值(例如RAM:4 GB和8 GB),还可以选择多个属性(例如RAM和屏幕大小)。 我需要这样的功能: 我曾经通过创建动态查询然后执行该查询来做到这一点: 但我认为这不是好方法,必须有一些更好的解决方案。该表中有数百万个属性,因此

  • 问题内容: 我有一个列的数据帧,。我需要创建一个列,以便为每个记录/行: 。 我应该怎么做呢? 问题答案: 您可以这样获得最大值: 所以: 如果您知道“ A”和“ B”是唯一的列,那么您甚至可以逃脱 我猜你也可以使用。

  • 我现在有:,但它需要Temp值的列表,而不是更严格地说是“a”值。 在sql中类似于:

  • 问题内容: 我有一个数据库 我怎样才能选择该猫排序,?那是 问题答案: 这应该做…除了名称的双破折号“-”以外… 按第一个案例的顺序/何时将所有属于最高级别的项目放在第一层,或者将所有项目放在第一层的ID的第二层。因此,如果您有超过1000个条目,尝试使用提供的父* 1000个示例hack就不会成为问题。当父ID = 0时,第二个案例/时间将强制进入其分组列表的TOP及其下的所有子条目,但在下一个