为了账号安全,请及时绑定邮箱和手机立即绑定

通过 Java 中的各种筛选器组合从 SQL 查询中获取列

通过 Java 中的各种筛选器组合从 SQL 查询中获取列

温温酱 2022-08-03 10:44:49
我想编写一个SQL查询来获取用户请求的所有列组合。例如,对于表用户:(ID、姓名、年龄、身高、体重)应该可以通过参数[id,姓名],[id,姓名,年龄],[年龄,身高],...为所有组合编写SQL查询当然效率太低。有没有一种有效的方法来使用ReadkEdStatement编写SQL查询?类似于以下内容: public User getByFiltered(User userDTO){    String sql = "SELECT * FROM user WHERE id=? AND age=? AND height=?";    PreparedStatement statement = dbConnectionManager.getConnection().prepareStatement(sql);    ... }但基本上可以请求列的任何组合。
查看完整描述

3 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

这是你想要的吗?


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);


查看完整回答
反对 回复 2022-08-03
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

最好在没有任何过滤器的情况下从DB中获取所有记录,然后在Java级别应用逻辑


查看完整回答
反对 回复 2022-08-03
?
holdtom

TA贡献1805条经验 获得超10个赞

你可以这样做:


SELECT * FROM user 

WHERE 

  (0 = ? OR id = ?) 

  AND 

  (0 = ? OR age = ?) 

  AND 

  (0 = ? OR height = ?)

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


  (0 = 0 OR id = 0) 

  AND 

  (0 = 1 OR age = 21) 

  AND 

  (0 = 1 OR height = 175)

意味着 的参数将是如果该列不相关并且它是否相关(参数也可以是任何内容)。

现在,因为计算结果总是为 TRUE(因为 is ),所以它不执行任何过滤。

但是因为是其他条件:并且必须是.


这样你就有了3 + 3个参数:

前3个是指示列是:

相关(所以你传递)

或不相关(所以你传递)的参数。

其他 3 个是执行筛选的实际参数(如果该列不相关,则为任何内容)。0 = ?01id(0 = 0 OR id = 0)0 = 0TRUE0 = 1FALSEage = 21height = 175TRUE10


查看完整回答
反对 回复 2022-08-03
  • 3 回答
  • 0 关注
  • 188 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号