# JPA风格查询
此部分为实验性功能
现代软件应用里,查询都倾向于简单化,可以获得更好的性能和并发能力。Java提出了JPA标准,在简单的查询里,我们可以通过方法名来自动创建查询,避免样板代码。easysql也支持类似JPA风格的查询构造方法:
val id: Int = ???
val name: String = ???
val query = jpa(user).find_by_id_and_name(id, name)
我们可以使用jpa
方法传入一个表结构对象,并调用一个动态的方法名,关键字之间使用下划线隔开。
可以看到,与Spring Data JPA等JPA实现不同的是,我们无需为查询创建创建一个Repository接口,并在里面创建方法名,而是直接动态调用即可。
得益于Scala3的类型系统和编译期元编程能力,easysql可以从方法名中自动推断出参数的类型,达到类型安全,比如上面的调用如果改为:
val id: Int = ???
val name: String = ???
val query = jpa(user).find_by_id(id, name)
就会产生编译错误。
由于推断出的参数是元组类型,因此单个参数的情况下,我们需要传入一个一元组,这样不太方便,我们可以import easysql.dsl.JPA.given
来简化调用:
// 导入前
val id: Int = ???
val q1 = jpa(user).find_by_id(id *: EmptyTuple)
// 导入后
import easysql.dsl.JPA.given
val q2 = jpa(user).find_by_id(id)
以下是关键字列表、对应的sql运算符以及推断出来的参数类型(使用col
指代实际的字段名,参数类型会依次拼接,最终生成一个元组类型):
关键字 | 运算符 | 参数类型 |
---|---|---|
find_by | ||
and | and | |
or | or | |
col | = | col.type |
col_gt | > | col.type |
col_ge | >= | col.type |
col_lt | < | col.type |
col_le | <= | col.type |
col_not | <> | col.type |
col_in | in | List[col.type] |
col_notIn | not in | List[col.type] |
col_like | like '%xxx%' | String |
col_notLike | not like '%xxx%' | String |
col_startingWith | like 'xxx%' | String |
col_endingWith | like '%xxx' | String |
col_between | between | (col.type, col.type) |
col_notBetween | not between | (col.type, col.type) |
暂不支持实体类中的自定义类型字段。