JPQL 设计器
JPQL 设计器是一种简化 Jmix 中创建和修改 JPQL 查询语句的可视化工具。其目的是对手工编写 JPQL 的工作进行抽象,使所有的开发者都能处理数据的访问。
JPQL 设计器提供了用于构建 JPQL 查询语句的界面。可以在不直接编写 JPQL 代码的情况下定义目标表,数据选择条件,排序和其他参数。该工具输出正确格式的 JPQL 查询字符串。
此功能可在最多 10 个实体和角色的小项目中免费使用。在大项目中,需要快速开发版或企业版 订阅^。 |
核心功能包括:
-
可视化语句设计器:一个构建 JPQL 的图形界面,无需手动编写 JPQL 语句。
-
智能补全:上下文感知,补全实体和属性,以减少手动编写的出错率。
-
语句语法检验:实时检查查询语句的语法问题以保证语句的完整性。
JPQL 设计器界面
JPQL 设计器提供了一个对话框,显示查询语句的结构,用户可以编辑并添加查询语句的功能。

JPQL 设计器会显示生成的 JPQL 语句,以进行审查。
JPQL 设计器在保存前会执行检查,以确保语句的结构正确,具体会检查:
-
用于排序的实体属性必须存在于结果集中。
-
条件中内联参数的类型与实体属性的类型必须一致。
当保存 JPQL 查询语句结构时,设计器会生成一个 JPQL 字符串,并根据设计器打开的方式将语句保存在原来的 Java 或 XML 文件中。
如果打开设计器修改已有的语句,则会在加载时解析该语句。但是,如果已有语句使用了设计器不支持的结构(例如嵌套的子查询),则不会打开设计器并弹出消息告知开发者。
选择根实体
创建新查询语句时,设计器会提示用户选择一个查询的根实体(即 "from E"
子句)。

-
Entity class 字段提供了选项,可以按类名或实体名快速搜索。
-
Entity alias 字段需要用户填写实体的别名,然后进行验证以确保符合JPQL语法。
当编辑已有的查询语句时,除非完全清空已有的查询语句结构,否则不允许修改查询的根实体。
JPQL 查询结果
Result type 字段用于指定查询的输出参数类型。

输出参数可以是:
-
根实体本身。
-
实体的属性,或内部属性的路径(例如,
student.group.number
)。 -
应用在实体或实体属性的聚合函数:
AVG
、COUNT
、MIN
、MAX
、SUM
。
可以指定多个输出参数。以及,还可以使用 Distinct 选项。
指定查询条件
JPQL 设计器提供了几种方式用于设置查询条件,可以对数据进行过滤或排序。本小节将介绍在 JPQL 设计器使用 WHERE
、HAVING
、ORDER BY
的详细内容。
用 WHERE 子句过滤数据
WHERE
子句可以根据 JPQL 中的一个或多个条件对数据进行过滤。
在 JPQL 设计器中,可以使用实体属性和值的相关可视化控件定义 WHERE
条件。包含:
-
从属性列表选择实体别名、属性或内部属性路径。
-
选择一个比较操作符(例如,
=
、<>
、>
、<
、LIKE
、IN
)。 -
设置一个比较值,或其他属性或参数用于比较。
JPQL 设计器提供了下列功能:
-
子条件的构造:
-
选择操作符:
=
、<>
、>
、<
、>=
、<=
、IN
、NOT IN
、LIKE
、NOT LIKE
、IS NULL
、IS NOT NULL
。 -
LIKE
中支持修饰符:%
、_
。 -
字符串函数:
LOWER
、UPPER
、TRIM
等。 -
支持日期时间函数:
CURRENT_DATE
、CURRENT_TIME
、CURRENT_TIMESTAMP
等。
-
-
条件组合:
-
AND
:两个条件需都为true
。 -
OR
:至少一个条件为true
。
-
-
带参数的条件:
还可以定义带参数的条件。可用于动态查询语句的构建。在设计器中定义参数,执行查询时传入参数。
点击下图中的 Add query condition 链接按钮或 Add (+) 按钮即可以为语句设置条件。

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

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

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

用 ORDER BY 子句排序
ORDER BY
子句中可以对查询结果进行排序,可以按照一个或多个属性并以升序(ASC
)或降序(DESC
)排列。
在 ORDER tab 中,可以设置单一或多个排序规则。排序规则可以是:
-
按根实体的一个属性排序。
-
按内部属性的路径排序(例如,
student.group.number
)。
对于定义的每个排序规则,还需要选择排序的方式:ASC
或 DESC
。
用 HAVING 子句过滤聚合数据
HAVING
子句主要用于聚合数据。可以根据聚合函数(例如,COUNT
、SUM
、AVG
、MIN
、MAX
)的结果对分组进行过滤。
如果选择了 Tuple 结果类型 并使用了聚合函数,则会显示 HAVING tab。

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