首页 > 解决方案 > Java如何为List构建SQL SELECT语句?

问题描述

假设我们有一个Car类,其属性代表 Oracle 数据库中的字段,它只允许具有主键年份、品牌和型号的唯一汽车:

private int year
private String make
private String model
private String color

那么我们的例子List<Car>可能是:

Car car1 = new Car(2015, "Toyota", "Camry", "Blue")
Car car2 = new Car(2017, "Honda", "Corolla", "White")
Car car3 = new Car(2011, "Honda", "Civic", "Red")
 

假设 oracle 数据库中有多个条目,如果我想要一个从 a 获取属性的 select 语句List<Car>来选择数据库中具有 3 个主键的相同汽车,我想要类似的东西:

select * from cars_table where year in (2015,2011,2017) and make in (“Toyota”,”Honda”) and model in (“Camry”,”Corolla”,”Civic”)

我相信这个 sql 语句有效,但我不知道如何在 Java 中构建这个语句。我的算法技能不是最好的,我已经尝试对 List 使用 for 循环,但我无法拼凑第二个获取参考。太感谢了!

标签: javasqloracle

解决方案


您的查询将带回太多行,因为它会带回 a 2011 Toyota Corolla(在许多其他不需要的组合中)。

要获取仅包含这些值组合的值,您需要以下查询:

SELECT *
FROM   cars_table
WHERE  ( year, make, model ) IN (
         ( 2015, 'Toyota', 'Camry' ),
         ( 2017, 'Honda', 'Corolla' ),
         ( 2011, 'Honda', 'Civic' )
       )

db<>在这里摆弄


在 Java 中:

StringBuilder query = new StringBuilder();
query.append( "SELECT * FROM cars_table WHERE (year, make, model) IN (" );
boolean first = true;
for ( final Car car: carList )
{
  if ( first )
  {
    first = false;
  } else {
    query.append(',');
  }
  query.append('(');
  query.append(car.getYear());
  query.append(",'");
  query.append(car.getMake());
  query.append("','");
  query.append(car.getModel());
  query.append("')");
}
query.append(')');
System.out.println(query);

注意:这假设不会发生 SQL 注入;如果您正在接受用户输入,那么您应该确保在从字符串构建查询或制定查询之前清理输入,以便您可以通过代表 SQL 对象集合的绑定变量传递数组。


推荐阅读