跳到主要内容

查询

根类型和派生类型查询

查询根实体可以读取所有可实例化分支。即使对象抓取器没有包含鉴别器属性,Jimmer也会在内部读取 它,并返回实际实体类型的对象。

ClientTable client = ClientTable.$;

List<Client> clients = sqlClient
.createQuery(client)
.select(client.fetch(ClientFetcher.$.name()))
.execute();

例如,鉴别器为ORG的数据行会返回Organization对象,Person数据行会返回Person对象。 直接为Organization创建的查询只返回该分支,并通过普通的生成表类型暴露其属性。

类型专属的抓取分支

根对象抓取器需要加载派生类型声明的属性时,使用forType

ClientFetcher fetcher = ClientFetcher.$
.name()
.forType(OrganizationFetcher.$.taxCode())
.forType(PersonFetcher.$.firstName().lastName());

每个返回对象只加载与其实际类型匹配的分支。类型分支也可以包含关联,两种继承策略都支持它。

类型条件和向下转型

生成的根表和中间类型表提供多态操作:

操作含义
instanceOf(Type)匹配Type及其所有可实例化派生类型
exactType(Type)只匹配精确类型
treatAs(TypeTable)使用inner语义向下转型;不匹配的数据行被排除
tryTreatAs(TypeTable)使用left/nullable语义向下转型;不匹配的数据行产生null派生属性
ClientTable client = ClientTable.$;
OrganizationTable organization =
client.treatAs(OrganizationTable.class);

sqlClient
.createQuery(client)
.where(client.instanceOf(Organization.class))
.select(client.id(), organization.taxCode())
.execute();

这些操作也可以用于目标属于继承层次的关联路径。

根查询的类型匹配

根查询默认使用TypeMatchMode.POLYMORPHIC。如果可实例化根类型的查询只需要鉴别器精确等于 根类型的数据,使用TypeMatchMode.EXACT

sqlClient
.createQuery(ClientTable.$)
.typeMatchMode(TypeMatchMode.EXACT)
.select(ClientTable.$)
.execute();

TypeMatchMode包含三个值:

  • AUTO:可实例化类型使用精确匹配,抽象类型使用多态匹配。
  • EXACT:只匹配请求的类型;不能用于抽象类型。
  • POLYMORPHIC:匹配请求的类型及其所有可实例化派生类型。

继承感知的修改操作使用相同的枚举值,但默认值是AUTO,详见修改操作