# 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)

暂不支持实体类中的自定义类型字段。