JPQL 设计器

JPQL 设计器是一种简化 Jmix 中创建和修改 JPQL 查询语句的可视化工具。其目的是对手工编写 JPQL 的工作进行抽象,使所有的开发者都能处理数据的访问。

JPQL 设计器提供了用于构建 JPQL 查询语句的界面。可以在不直接编写 JPQL 代码的情况下定义目标表,数据选择条件,排序和其他参数。该工具输出正确格式的 JPQL 查询字符串。

此功能可在最多 10 个实体和角色的小项目中免费使用。在大项目中,需要快速开发版或企业版 订阅^

核心功能包括:

  • 可视化语句设计器:一个构建 JPQL 的图形界面,无需手动编写 JPQL 语句。

  • 智能补全:上下文感知,补全实体和属性,以减少手动编写的出错率。

  • 语句语法检验:实时检查查询语句的语法问题以保证语句的完整性。

启动 JPQL 设计器

JPQL 设计器可以通过以下方式启动:

  • 在创建数据加载操作(加载实体或实体列表时),通过 代码片段 工具箱打开。

  • 通过已有 JPQL 语句的 行标记 打开:

    jpql designer launch 1
  • Jmix UI 的属性面板中,访问 query 属性:

    jpql designer launch 2

JPQL 设计器界面

JPQL 设计器提供了一个对话框,显示查询语句的结构,用户可以编辑并添加查询语句的功能。

jpql designer

JPQL 设计器会显示生成的 JPQL 语句,以进行审查。

JPQL 设计器在保存前会执行检查,以确保语句的结构正确,具体会检查:

  • 用于排序的实体属性必须存在于结果集中。

  • 条件中内联参数的类型与实体属性的类型必须一致。

当保存 JPQL 查询语句结构时,设计器会生成一个 JPQL 字符串,并根据设计器打开的方式将语句保存在原来的 Java 或 XML 文件中。

如果打开设计器修改已有的语句,则会在加载时解析该语句。但是,如果已有语句使用了设计器不支持的结构(例如嵌套的子查询),则不会打开设计器并弹出消息告知开发者。

选择根实体

创建新查询语句时,设计器会提示用户选择一个查询的根实体(即 "from E" 子句)。

jpql designer 1
  • Entity class 字段提供了选项,可以按类名或实体名快速搜索。

  • Entity alias 字段需要用户填写实体的别名,然后进行验证以确保符合JPQL语法。

当编辑已有的查询语句时,除非完全清空已有的查询语句结构,否则不允许修改查询的根实体。

JPQL 查询结果

Result type 字段用于指定查询的输出参数类型。

jpql designer 2

输出参数可以是:

  • 根实体本身。

  • 实体的属性,或内部属性的路径(例如,student.group.number)。

  • 应用在实体或实体属性的聚合函数:AVGCOUNTMINMAXSUM

可以指定多个输出参数。以及,还可以使用 Distinct 选项。

指定查询条件

JPQL 设计器提供了几种方式用于设置查询条件,可以对数据进行过滤或排序。本小节将介绍在 JPQL 设计器使用 WHEREHAVINGORDER BY 的详细内容。

用 WHERE 子句过滤数据

WHERE 子句可以根据 JPQL 中的一个或多个条件对数据进行过滤。

在 JPQL 设计器中,可以使用实体属性和值的相关可视化控件定义 WHERE 条件。包含:

  • 从属性列表选择实体别名、属性或内部属性路径。

  • 选择一个比较操作符(例如,=<>><LIKEIN)。

  • 设置一个比较值,或其他属性或参数用于比较。

JPQL 设计器提供了下列功能:

  • 子条件的构造:

    • 选择操作符:=<>><>=<=INNOT INLIKENOT LIKEIS NULLIS NOT NULL

    • LIKE 中支持修饰符:%_

    • 字符串函数:LOWERUPPERTRIM 等。

    • 支持日期时间函数:CURRENT_DATECURRENT_TIMECURRENT_TIMESTAMP 等。

  • 条件组合:

    • AND:两个条件需都为 true

    • OR:至少一个条件为 true

  • 带参数的条件:

    还可以定义带参数的条件。可用于动态查询语句的构建。在设计器中定义参数,执行查询时传入参数。

点击下图中的 Add query condition 链接按钮或 Add (+) 按钮即可以为语句设置条件。

jpql designer 3

然后,从 Choose Attribute 对话框中选择一个实体属性,从下拉列表选择一个运算符:

jpql designer 4

如需设置查询参数,点击 Parameter 列的 …​ 按钮。在打开的对话框中可以直接输入参数名、选择实体属性或使用函数。

jpql designer 6

查询条件可以用 andor 运算符连接。最终的语句如下所示:

jpql designer 5

用 ORDER BY 子句排序

ORDER BY 子句中可以对查询结果进行排序,可以按照一个或多个属性并以升序(ASC)或降序(DESC)排列。

ORDER tab 中,可以设置单一或多个排序规则。排序规则可以是:

  • 按根实体的一个属性排序。

  • 按内部属性的路径排序(例如,student.group.number)。

对于定义的每个排序规则,还需要选择排序的方式:ASCDESC

用 HAVING 子句过滤聚合数据

HAVING 子句主要用于聚合数据。可以根据聚合函数(例如,COUNTSUMAVGMINMAX)的结果对分组进行过滤。

如果选择了 Tuple 结果类型 并使用了聚合函数,则会显示 HAVING tab。

jpql designer 7

如果在 Select 区域选择了一个实体属性但没有使用聚合函数(Aggregate 字段为空),则会启用 GROUP BY 功能。