specification 原生sql 复杂查询
时间: 2023-08-13 19:07:32 浏览: 107
SQL Server2005 技术内幕:T-SQL查询(笔记).docx
Specification 和原生 SQL 都可以用于复杂查询,但是它们的使用方式有所不同。
对于 Specification,您可以使用 CriteriaBuilder 和 Root 对象来构建查询条件。以下是一个使用 Specification 进行复杂查询的示例:
```
public Specification<User> getSpec(String name, int age) {
return (root, query, cb) -> {
List<Predicate> predicates = new ArrayList<>();
if (name != null && !name.isEmpty()) {
predicates.add(cb.equal(root.get("name"), name));
}
if (age > 0) {
predicates.add(cb.greaterThanOrEqualTo(root.get("age"), age));
}
return cb.and(predicates.toArray(new Predicate[0]));
};
}
public Page<User> getUsers(String name, int age, Pageable pageable) {
Specification<User> spec = getSpec(name, age);
return userRepository.findAll(spec, pageable);
}
```
在此示例中,我们使用 CriteriaBuilder 和 Root 对象构建了一个复杂的查询条件,然后将其传递给 findAll() 方法进行查询。
对于原生 SQL,您可以使用 JOIN、WHERE、GROUP BY、HAVING 和 ORDER BY 等 SQL 关键字来构建复杂查询。以下是一个使用原生 SQL 进行复杂查询的示例:
```
public List<User> getUsers(int id, String name, int age) {
String sql = "SELECT u.* FROM user u ";
List<Object> params = new ArrayList<>();
if (id > 0 || name != null || age > 0) {
sql += "WHERE ";
if (id > 0) {
sql += "u.id = ? ";
params.add(id);
}
if (name != null && !name.isEmpty()) {
if (id > 0) {
sql += "AND ";
}
sql += "u.name = ? ";
params.add(name);
}
if (age > 0) {
if (id > 0 || (name != null && !name.isEmpty())) {
sql += "AND ";
}
sql += "u.age >= ? ";
params.add(age);
}
}
return jdbcTemplate.query(sql, params.toArray(), new BeanPropertyRowMapper<>(User.class));
}
```
在此示例中,我们使用了 WHERE 子句来构建复杂查询条件,并使用了 jdbcTemplate 的 query() 方法来执行 SQL 查询。您可以根据需要更改 SQL 查询语句,并使用不同的查询方法来获取不同类型的结果。
阅读全文