> For the complete documentation index, see [llms.txt](https://ankang.gitbook.io/commons/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ankang.gitbook.io/commons/commons-jpa/gong-neng/gao-ji-cha-xun.md).

# 高级查询

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

* 实体中的字段名可能和查询条件中的字段名不一致
* 查询条件的匹配方式未必是“相等”

为了应对上述复杂的情况，`@QueryCondition`注解分别提供了`field`和`type`两个属性。

```java
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：

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

{% hint style="info" %}
&#x20;所有受支持的匹配方式及说明请参考：
{% endhint %}
