高级查询

实际使用过程中,往往面临着更加复杂的情况:

  • 实体中的字段名可能和查询条件中的字段名不一致

  • 查询条件的匹配方式未必是“相等”

为了应对上述复杂的情况,@QueryCondition注解分别提供了fieldtype两个属性。

class Foo {
    Long id;
    String name;
    int size;
    String type;
}
class FooQo {
    @QueryCondition(field="name", type=Condition.STARTS_WITH)
    String namePrefix;
    @QueryCondition(field="size", type=Condition.NOT_LESS_THAN)
    int minSize;
    @QueryCondition(field="size", type=Condition.NOT_GREATER_THAN)
    int maxSize;
    @QueryCondition(type=Condition.IN)
    List<String> type;
}

FooQo fooQo = new FooQo("foo", 1, 10, Arrays.asList("A", "B"));
Specification<Foo> specification = SpecificationFactory.getSpecification(fooQo);
List<Foo> foos = fooRepository.findAll(specification);

生成的SQL:

SELECT * FROM FOO
WHERE LOWER(FOO.NAME) LIKE 'foo%'
	AND FOO.SIZE >= 1
	AND FOO.SIZE <= 10
	AND FOO.TYPE IN ('A', 'B');

所有受支持的匹配方式及说明请参考:

Last updated