where子句中的动态参数数量

时间:2018-10-29 20:41:23

标签: java sql hibernate spring-boot

在一开始,我需要说的是,我尝试这样做的方式可能很愚蠢,但这只是我自己弄清楚的一种方式。

我有一个具有汽车属性的表,一次我需要通过一个参数获取日期 {   “ mark”:“ Audi” }

其他时间我需要更具体 {   “ mark”:“ Audi”,   “型号”:“ A4” }

所以我写方法

appRTCmobile

从sql中返回WHERE子句“ mark = Audi&model = A4,然后我尝试将这部分sql作为参数传递给存储库

    public List<Object> findVehicleProperty(String propertyType, Vehicle vehicle) {
    String queryParam = "";

    if(vehicle.getMark() != null) queryParam += "mark='"+vehicle.getMark()+"'&";
    if(vehicle.getModel() != null) queryParam += "model='"+vehicle.getModel()+"'&";
    if(vehicle.getEnginePower() != null) queryParam += "engine_power="+vehicle.getEnginePower()+"&";
    if(vehicle.getSeatCount() != null) queryParam += "seat_count="+vehicle.getSeatCount()+"&";
    if(vehicle.getDoorsCount() != null) queryParam += "doors_count="+vehicle.getDoorsCount()+"&";
    if(vehicle.getGearboxCount() != null) queryParam += "gearbox_count="+vehicle.getGearboxCount()+"&";
    if(vehicle.getType() != null) queryParam += "type="+vehicle.getType()+"&";


    //remove last "&" mark
    if (queryParam.length() > 0) {
        queryParam = queryParam.substring(0, queryParam.length() - 1);
    }


    return vehicleRepository.getParameters(queryParam);
}

我可以看到它很好地插入了

@Query(value = "select * from Vehicle where ?1", nativeQuery = true)
List<Object> getParameters(String query);

但此请求始终返回空集合,如果我直接在DB上使用select * from Vehicle where mark ='Audi'&model ='A4'从我得到正确的结果。

你知道为什么吗?

2 个答案:

答案 0 :(得分:1)

您不能使用准备好的语句来“注入”整个where子句,因为它会逸出您的“本地字符串”,因此您将以

结尾
SELECT * FROM whatever WHERE '123456'

或类似的东西。

对于动态条件(您的情况),请使用CriteriaAPI,以便CriteriaBuilder在这里成为您的朋友。

答案 1 :(得分:0)

在SQL方面,建议为COALESCE

不确定在春季是否可以使用

在您的情况下,它可以像:

SELECT * FROM Vehicle WHERE COALESCE(mark = :mark, true) and COALESCE(model = :model, true)  and   COALESCE(engine_power = :engine_power, true) and COALESCE(seat_count = :seat_count, true) and COALESCE(doors_count = :doors_count, true) and COALESCE(gearbox_count = :gearbox_count, true) and COALESCE(type = :type, true) ;

这建议您将所有可能的参数都放入“和COALESCE(attribute =:attribute,true)”或“和COALESCE(attribute =?1,true)”