关联查询
对于查询条件的目标字段属于关联实体的情况,@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