关联查询

对于查询条件的目标字段属于关联实体的情况,@QueryCondition注解的field属性支持以.的形式将查询条件作用于关联对象中的字段。

class Foo {
    Long id;
    String name;
    @ManyToOne
    Bar bar;
}
class Bar {
    Long id;
    String name;
    @OneToMany(mappedBy="bar")
    List<Foo> foos;
}
class FooQo {
    @QueryCondition(field="name")
    String fooName;
    @QueryCondition(field="bar.name")
    String barName;
}

FooQo fooQo = new FooQo("foo", "bar");
Specification<Foo> specification = SpecificationFactory.getSpecification(fooQo);
List<Foo> foos = fooRepository.findAll(specification);

生成的SQL:

SELECT DISTINCT *
FROM FOO
	INNER JOIN BAR ON BAR.ID = FOO.BAR_ID 
WHERE LOWER(FOO.NAME) = 'foo' 
	AND LOWER(BAR.NAME) = 'bar';

如果关联关系是一对多/多对多,需要在field中对应的字段名称前面加*

class Foo {
    Long id;
    String name;
    @ManyToMany
    List<Bar> bars;
}
class Bar {
    Long id;
    String name;
    @ManyToMany(mappedBy="bars")
    List<Foo> foos;
}
class FooQo {
    @QueryCondition(field="name")
    String fooName;
    @QueryCondition(field="*bars.name")
    String barName;
}

FooQo fooQo = new FooQo("foo", "bar");
Specification<Foo> specification = SpecificationFactory.getSpecification(fooQo);
List<Foo> foos = fooRepository.findAll(specification);

生成的SQL:

SELECT DISTINCT *
FROM FOO
	INNER JOIN FOO_BAR R ON R.FOO_ID = FOO.ID
	INNER JOIN BAR ON BAR.ID = R.BAR_ID
WHERE LOWER(FOO.NAME) = 'foo' 
	AND LOWER(BAR.NAME) = 'bar';

Last updated