【问题标题】:Get columns from SQL query by various filter combinations in Java通过Java中的各种过滤器组合从SQL查询中获取列
【发布时间】:2019-03-11 09:34:37
【问题描述】:

我想编写一个 SQL 查询来获取用户请求的所有列组合。例如对于表用户:(id, name, age, height, weight)

应该可以通过参数[id, name], [id, name, age], [age, height], ...进行过滤

为所有组合编写 SQL 查询当然效率太低。有没有一种使用 PreparedStatement 编写 SQL 查询的有效方法?

类似的东西:

 public User getByFiltered(User userDTO){

    String sql = "SELECT * FROM user WHERE id=? AND age=? AND height=?";
    PreparedStatement statement = dbConnectionManager.getConnection().prepareStatement(sql);
    ...
 }

但基本上可以请求列的任何组合。

【问题讨论】:

标签: java sql get prepared-statement


【解决方案1】:

这是你想要的吗?

SELECT u.*
FROM user u
WHERE (id = ? OR ? IS NULL) AND
      (age = ? OR ? IS NULL) AND
      (height = ? OR ? IS NULL);

请注意,这需要加倍参数。

命名参数简化了这一点:

SELECT u.*
FROM user u
WHERE (id = :id OR :id IS NULL) AND
      (age = :age OR :age IS NULL) AND
      (height = :height OR :height IS NULL);

【讨论】:

    【解决方案2】:

    你可以这样做:

    SELECT * FROM user 
    WHERE 
      (0 = ? OR id = ?) 
      AND 
      (0 = ? OR age = ?) 
      AND 
      (0 = ? OR height = ?)
    

    当你想搜索 age = 21height = 175(我更喜欢 cm)并且你不关心 id 时,你传递这些参数:

      (0 = 0 OR id = 0) 
      AND 
      (0 = 1 OR age = 21) 
      AND 
      (0 = 1 OR height = 175)
    

    表示0 = ? 的参数如果该列不相关,则为0,如果相关,则为1id 的参数也可以是任何值)。
    现在因为(0 = 0 OR id = 0) 的计算结果总是为TRUE(因为0 = 0TRUE),所以它不做任何过滤。
    但是因为0 = 1FALSE 其他条件:age = 21height = 175 必须是TRUE

    这样你就有 3 + 3 个参数:
    前 3 个参数指示列是否为:
    相关(因此您传递 1
    不相关(所以你传递0)。
    其他 3 个是执行过滤的实际参数(或任何与该列无关的参数)。

    【讨论】:

      【解决方案3】:

      最好从数据库中获取所有记录而不使用任何过滤器,然后在 Java 级别应用逻辑

      【讨论】:

        猜你喜欢
        • 2018-05-04
        • 2018-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-16
        • 1970-01-01
        • 2010-11-13
        相关资源
        最近更新 更多