# 查询创建器
与Spring-Data-JPA的查询创建器一致,如果你用过Spring-Data-JPA,那么对此应当熟悉。
使用注解com.yuehuanghun.mybatis.milu.annotation.NamingQuery
部分场景可结合注解com.yuehuanghun.mybatis.milu.annotation.StatementOptions进行使用
# 示例
@Mapper
public interface StudentMapper extends BaseMapper<Student, Long> {
@NamingQuery
public List<Student> findByName(String name);
@NamingQuery
public int countByName(String name);
@NamingQuery
public List<Student> findByClasssName(String className);
@NamingQuery
public List<Student> findTop5ByAddTimeAfter(Date addTimeBegin);
@NamingQuery
public List<Student> findByClasssNameOrderByClasssIdDescAddTimeAsc(String className);
}
在mapper中,使用@NamingQuery标识一个接口为查询创建器,否则会认为映射的的是由xml配置的statement
与Spring-Data-JPA一样,查询属性可以为关联实体的属性
@Mapper
public interface ClassMapper extends BaseMapper<Classs, Long> {
@NamingQuery
public List<Classs> findByTeacherListName(String teacherName);
@NamingQuery
public List<Classs> findByStudentListName(String studentName);
@NamingQuery
public List<Classs> findByStudentListNameInAndStudentListAgeGreaterThan(String[] studentNames, int age);
}
结合@StatementOptions使用,可以设置查询的列、设置查询表达式,设置查询表达则替换方法名为表达式
@Mapper
public interface StudentMapper extends BaseMapper<Classs, Long> {
@NamingQuery
@StatementOptions(selects = "age")
public Long findAgeById(Long id); // 只查一个属性时,可以以属性的类型为查询值返回类型
@NamingQuery
@StatementOptions(asExpression = "findByClasssNameOrderByClasssIdDescAddTimeAsc") // 可以避免方法名过长,但会使方法名表达不够准确
public List<Student> findByClasssName(String className);
}
# 条件关键字
| 关键字 | 例子 | JPQL 片段 |
|---|---|---|
| And | findByLastnameAndFirstname | … where x.lastname = ?1 and x.firstname = ?2 |
| Or | findByLastnameOrFirstname | … where x.lastname = ?1 or x.firstname = ?2 |
| Between | findByStartDateBetween | … where x.startDate between 1? and ?2 |
| LessThan | findByAgeLessThan | … where x.age < ?1 |
| GreaterThan | findByAgeGreaterThan | … where x.age > ?1 |
| After | findByStartDateAfter | … where x.startDate > ?1 |
| Before | findByStartDateBefore | … where x.startDate < ?1 |
| IsNull | findByAgeIsNull | … where x.age is null |
| IsNotNull,NotNull | findByAge(Is)NotNull | … where x.age not null |
| Like | findByFirstnameLike | … where x.firstname like ?1 |
| NotLike | findByFirstnameNotLike | … where x.firstname not like ?1 |
| StartingWith | findByFirstnameStartingWith | … where x.firstname like ?1(parameter bound with appended %) |
| EndingWith | findByFirstnameEndingWith | … where x.firstname like ?1(parameter bound with prepended %) |
| Containing | findByFirstnameContaining | … where x.firstname like ?1(parameter bound wrapped in %) |
| OrderBy | findByAgeOrderByLastnameDesc | … where x.age = ?1 order by x.lastname desc |
| Not | findByLastnameNot | … where x.lastname <> ?1 |
| In | findByAgeIn(Collection ages) | … where x.age in ?1 |
| NotIn | findByAgeNotIn(Collection age) | … where x.age not in ?1 |
| True | findByActiveTrue() | … where x.active = true |
| False | findByActiveFalse() | … where x.active = false |
# 操作关键字
| 关键字 | 例子 | JPQL 片段 |
|---|---|---|
| find/read/get/query/stream | findByLastname | select ... where x.lastname = ?1 |
| count | countByLastname | select count(*) from ... where x.lastname = ?1 |
| Distinct | findDistinctByLastname | select distinct ... where x.lastname = ?1 |
| delete/remove | deleteByLastname | delete from ... where x.lastname = ?1 |
# 行限制关键字(示例目标数据库为Mysql)
| 关键字 | 例子 | JPQL 片段 |
|---|---|---|
| Top | findTop5ByLastname | select ... where x.lastname = ?1 limit 5 |
| First | findFirstByLastname | select ... where x.lastname = ?1 limit 1 |