Java 具有某种逻辑的JPQL查询

Java 具有某种逻辑的JPQL查询,java,sql,jpa,jpql,Java,Sql,Jpa,Jpql,我只是想知道是否有可能创建一个JQPL查询,该查询将遍历表并选择所有与我传递给查询的对象上至少x ouf of y属性匹配的记录。想象汽车对象有5个属性:maxSpeed、weight、Color、power、type,然后我想查询一个数据库,以获得所有至少有2个属性的汽车,这些属性与我要传递给查询的汽车相同(不是实际的汽车,只是它的属性)。我找不到任何东西,所以我只是获取至少有一个属性匹配的所有条目(通过在查询中使用4'或'运算符),然后用Java处理结果列表。一定有一种方法可以通过使用JPQ

我只是想知道是否有可能创建一个JQPL查询,该查询将遍历表并选择所有与我传递给查询的对象上至少x ouf of y属性匹配的记录。想象汽车对象有5个属性:maxSpeed、weight、Color、power、type,然后我想查询一个数据库,以获得所有至少有2个属性的汽车,这些属性与我要传递给查询的汽车相同(不是实际的汽车,只是它的属性)。我找不到任何东西,所以我只是获取至少有一个属性匹配的所有条目(通过在查询中使用4'或'运算符),然后用Java处理结果列表。一定有一种方法可以通过使用JPQL来实现这一点,如果有任何提示,我将不胜感激。我目前使用的查询如下所示:

TypedQuery<Car> query = em.createQuery(
                "FROM Car c "
                + "WHERE c.maxSpeed = :maxSpeed "
                + "OR c.weight = :weight "
                + "OR c.colour = :colour "
                + "OR c.power = :power "
                + "OR LOWER(c.type) = LOWER(:type)"
            , Car.class);
        query = query.setParameter("maxSpeed ", car.getMaxSpeed ());
        query = query.setParameter("weight ", car.getWeight());
        query = query.setParameter("colour", car.getColour());
        query = query.setParameter("power", car.getPower());
        query = query.setParameter("type", car.getType());
query.getResultList()
TypedQuery query=em.createQuery(
“来自c车”
+“其中c.maxSpeed=:maxSpeed”
+“或c.重量=:重量”
+“或c.color=:颜色”
+“或c.power=:power”
+“或更低(c.type)=更低(:type)”
,汽车类);
query=query.setParameter(“maxSpeed”,car.getMaxSpeed());
query=query.setParameter(“weight”,car.getWeight());
query=query.setParameter(“color”,car.getcolor());
query=query.setParameter(“power”,car.getPower());
query=query.setParameter(“type”,car.getType());
query.getResultList()

我没有对它进行测试,但也许您可以使用一个包含JPQL case语句的构造,如下所示:

WHERE (CASE c.maxSpeed WHEN :maxSpeed THEN 1 ELSE 0 END
     + CASE c.weight WHEN :weight THEN 1 ELSE 0 END
     + CASE c.colour WHEN :colour THEN 1 ELSE 0 END
     + CASE c.power WHEN :power THEN 1 ELSE 0 END
     + CASE LOWER(c.type) WHEN LOWER(:type) THEN 1 ELSE 0 END) > 1

每个case语句返回0或1。如果总数大于1,则满足条件。

从技术上讲,可以写入“仅当至少有两个条件时返回”。但这将是漫长的。相反,最好是在列表中循环并过滤掉它们。这就是我正在做的,但是这样更好吗?我认为数据库操作会更快。查询并不是为了这个目的。你最好在查询的时候做。另外,我知道如何用冗长的查询来做,我对一些聪明的方法更感兴趣(如果有的话)