jpa查询语言2

NNER, LEFT, GROUP,
BY, HAVING, FETCH, DISTINCT, OBJECT, NULL, TRUE, FALSE, NOT, AND, OR,
BETWEEN, LIKE, IN, AS, UNKNOWN, EMPTY, MEMBER, OF, IS, AVG, MAX, MIN,
SUM, COUNT, ORDER, BY, ASC, DESC, MOD, UPPER, LOWER, TRIM, POSITION,
CHARACTER_LENGTH, CHAR_LENGTH, BIT_LENGTH, CURRENT_TIME, CURRENT_DATE,
CURRENT_TIMESTAMP, NEW, EXISTS, ALL, ANY, SOME.

UNKNOWN目前在JPQL中还没有用到。


路径表达式
路径表达式就是一个标识符号紧跟一个访问操作符(.)再紧跟一个状态字段或是关联字段。只要它们不是集合(collections),就可以遍历关系。下图是agoraBB项目对象模型的一部分,用于解释路径表达式。


图 1. 路径表达式模型实例


PrivateMessage所属于的User的关系是由PrivateMessage的关联关系字段toUser表示的。User有一个关联到Role的集合关联字段roles,还有一个关联到UserIpAddress的字段userIpAddress。

由于在在这些关系,你可以进行以下操作。


PrivateMessage所属用户User的IP地址UserIpAddresses

SELECT p.toUser.userIPAddresses from PrivateMessage pPrivateMessage所属用户User的角色Role

SELECT p.toUser.roles from PrivateMessage pUser的角色Role,获取所有的无重复的角色名称。

SELECT DISTINCT r.name FROM User u JOIN u.roles rUser的IP地址UserIpAddresses

SELECT DISTINCT u.userIPAddresses FROM User u下图关系略有不同。


图 2. 路径表达式模型实例2


图中,论坛Forum与其主题Topics的关系由Forum的字段topics表示,从Topics到Post的关系由Topic的字段topics表示。从对象关系图可以看出哪些JPQL是合法的,哪些不合法。


查询论坛Forum的主题Topic,要获取标题(subject):路径表达是不合法的,不能直接通过集合访问。

SELECT f.topics.subject FROM Forum f – ILLEGAL查询论坛Forum主题Topic的帖子Post,使用JOIN操作符,表达式是合法的。

SELECT t.subject FROM Forum f JOIN f.topics AS t查询论坛Forum主题Topic的帖子Post,,路径表达是不合法的,不能直接通过集合访问。

SELECT f.topics.posts FROM Forum f – ILLEGAL查询论坛Forum主题Topic的帖子Post,使用JOIN操作符,表达式是合法的。

SELECT p FROM Forum f JOIN f.topics t JOIN t.posts p

注意
虽然JPA规范中明确表示无法访问一个集合关系字段,据我在Hibernate和Toplink上的测试,在一个目标实体中可以访问集合关联字段或状态字段。在JPA的BNF范式针对路径访问指明了从Forum访问Topic,所以读取主题就是非法的。如果你要访问一个集合字段的目标,使用第二个例子如示JOIN语法。

总之,你可以使用导航操作符(.)来遍历实体对象关系图,查询的类型是由SELECT语句决定的。SELECT语句可以包含标识变量和路径表达式。路径表达式可以遍历整个对象关系图,只要你从左到右访问的是单值关联字段,你无法访问一个集合字段或是一个状态关联字段。


界定变量(Range Variables)
界定变量使用与&SQL相似的语法,将实体名绑定到一个标志符上。界定变量声明如下(在一个查询语句的SELECT语句):



entityName [AS] identification_variable 你可以通过使用多个界定变量来使用同一实体,下面的例子来自JPA规范。



SELECT DISTINCT o1FROM Order o1, Order o2WHERE o1.quantity > o2.quantity ANDo2.customer.lastname = ‘Smith’ ANDo2.customer.firstname= ‘John’ 此查询返回大于John Smith的定单的所有的订单。


JOINS
join出现在两个或多个实体联合查询产生一个JPQL查询结果。JPQL中join与SQL中的SQL相似。最后,要说明的是,所有的JPQL会转换成SQL查询。出现以下情况时,就可以用上join。


访问集合关联字段的路径表达式出现在SELECT语句

join保留字出现在WHERE语句中

定义两个或多个界定变量

如果你在一个查询中使用了一个以上的实体,你会获取所有实体的实例。这一结果称为Cartesian product(卡笛尔产品)。假使你的系统中有8个角色和4个用户,下面的查询会得到32个对象。



SELECT r, u FROM Role r, User u 你可能想用某种join来减少查询结果的数量。如果你想通过字段而不是通过主键来关联实体,你可以使用theta-join。例如:



SELECT t FROM Topic t, Forum f WHERE t.postCount = f.forumPostCount 这条查询语句返回的是与论坛回复(Forum)数相同的主题(Topic)。theta-join允许你关联那些没有显式关联关系或者关联到没有关系但是等同的信息的实体。


INNER JOIN
JPQL中inner join也是用于关系联合。其语法如下:



[INNER] JOIN join_association_path_expression [AS] identification_variable INNER和AS都是可选的。虽然它们对查询没有什么影响,你还是可以使用它们来更加清晰的表达你的意图。

join_assocation_path_expression的意思是你可以访问一个关联实体,不管是单值关联还是一个集合。下图演示了两个inner join查询:


图 3.


因为你不能在SELECT语句中使用一个集合关联字段,JPQL为你提供了INNER JOIN操作符。如果你想访问Forum-Topic-Post的关联关系(如图2所示),获得所有Post的标题,你可以使用这样一条查询语句:



SELECT p.title FROM Forum f JOIN f.topics AS t JOIN t.posts AS p 这条查询会返回0个或多个String对象,封装的是Forum-Topic-Post联合查询的回复的标题。


LEFT OUTER JOIN
一个outer join会返回一个实体的所有实例和其它与join criteria匹配的其它实体的实例。一个left join的语法如下:



LEFT [OUTER] JOIN join_association_path_expression [AS] identification_variable [OUTER]是可选的,因为在JPQL中LEFT JOIN和LEFT OUTER JOIN以认为是等同的。使用上图中所示的Forum/Post实体关系,下面的left join操作可以读取所有的Forum和任何与Forum关联的Topic。如果找不到1
【直流微电网】径向直流微电网的状态空间建模与线性化:一种耦合DC-DC变换器状态空间平均模型的方法 (Matlab代码实现)内容概要:本文介绍了径向直流微电网的状态空间建模与线性化方法,重点提出了一种基于耦合DC-DC变换器状态空间平均模型的建模策略。该方法通过对系统中多个相互耦合的DC-DC变换器进行统一建模,构建出整个微电网的集中状态空间模型,并在此基础上实施线性化处理,便于后续的小信号分析与稳定性研究。文中详细阐述了建模过程中的关键步骤,包括电路拓扑分析、状态变量选取、平均化处理以及雅可比矩阵的推导,最终通过Matlab代码实现模型仿真验证,展示了该方法在动态响应分析和控制器设计中的有效性。; 适合人群:具备电力电子、自动控制理论基础,熟悉Matlab/Simulink仿真工具,从事微电网、新能源系统建模与控制研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握直流微电网中多变换器系统的统一建模方法;②理解状态空间平均法在非线性电力电子系统中的应用;③实现系统线性化并用于稳定性分析与控制器设计;④通过Matlab代码复现和扩展模型,服务于科研仿真与教学实践。; 阅读建议:建议读者结合Matlab代码逐步理解建模流程,重点关注状态变量的选择与平均化处理的数学推导,同时可尝试修改系统参数或拓扑结构以加深对模型通用性和适应性的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值