jpa查询语言4

作符指定为一个状态字段指定一系列的值。你可以列出一个或多个字符串或参数值(基于位置或命名的),或者利用子查询动态的生成一系列的值。字符型,数字型,枚举型的状态字段可以用在IN操作符上。状态字段的类型必须与列表中的值的类型一致。IN操作符的语法为:



state-field [NOT] in (item {, item2}* | subquery). 这里有几个例子。



SELECT f FROM Forum f WHERE f.type IN (?1, ?2)SELECT f FROM Forum f WHERE f.type IN (1, 2)


LIKE
LIKE允许你根据部分值搜索字符串字段。JPQL用一个下划线(_)表示你搜索字符字符串中任一字符。在查询语句中可以用百分号(%)表示一系列字符,其它的字符代表他们本身。LIKE的一般格式为:



string-expression [NOT] LIKE pattern [ESCAPE escape-char] 如果你必须在查询语句中使用下划线或百分号作为字面字符,使用ESCAPE格式。例如,你可以用forum.description like ‘QA\_%’ ESCAPE ‘\’。你必须在下划线或百分号前加入反反斜线符号人,并且在搜索字符串后面加入ESCAPE ‘\’语法。这里列出几个例子:




‘tr_ck’可以匹配‘truck’和‘trick’, 但不能匹配‘trucker’。

‘tr%’可以匹配‘truck’, ‘tractor’, ‘trick’, 等等。

‘tr_ck%’可以匹配‘truck’, ‘trick’, 和‘trucker’。

如果你想搜索字符串_hello,你的查询语句应该是这样的:



‘\_hello’ ESCAPE ‘\’ ESCAPE ‘\’告诉数据库,“我正在一个转义字符('\')上使用反斜线”。下面用代码表示:



em.createQuery("SELECT f FROM Forum f " +"WHERE f.description LIKE '\\_%' ESCAPE '\\'"); 在这段代码中,你使用了两个反斜线。第一个是为了Java编译器,第二个是由于JPQL解析器。

如果在MySQL数据库上执行上面的ESCAPE查询语句,你可能会得到一个数据库异常。默认情况下,MySQL会将反斜线识别成一个转义符号,所以它告诉你像处理转义符号那样处理反斜线是错误的。为了使你的查询能在不同数据库之间进行移植。你必须在JDBC连接中对所有MySQL关闭所有MySQL数据库实例上的反斜线转义功能。要在你的JDBC连接上禁用反斜线转义,将下面的URL中的sessionVariables部分添加到你的JDBC连接中。



jdbc:mysql://localhost:3306/db?sessionVariables=sql_mode=NO_BACKSLASH_ESCAPES 更多信息,请参考MySQL文档。


IS NULL
IS NULL比较操作符能够让检测NULL字段,不管是单值路径表达式还是输入参数。你可以使用IS NOT NULL来确保一个单值路径表达式有非空值,或者使用IS NULL来检测NULL值。



SELECT p FROM PrivateMessage p WHERE p.dateRead IS NOT NULL// toUser references a many-to-one relationship, so you can use IS [NOT] NULLSELECT p FROM PrivateMessage p WHERE p.toUser IS NOT NULL// this query does not work because we are using a// collection-value path-expressionSELECT f FROM Forum f WHERE f.topics IS NULL


IS EMPTY
IS [NOT] EMPTY操作用于空或者非空的集合值表达式。



// the above query rewritten to use IS EMPTYSELECT f FROM Forum f WHERE f.topics IS EMPTY// this query will find all forum entities with topics// (i.e. the collection is not empty)SELECT f FROM Forum f WHERE f.topics IS NOT EMPTY


MEMBER
可以用[NOT] MEMBER [OF]来判断一个实体是否是一个集合的一部分。[OF]是可选的,不影响MEMBER比较操作符。你可用可不用。

可以用NOT MEMBER来判断一个实体不是一个集合的组成部分。MEMBER的语法如下:



Expression [NOT] MEMBER [OF] collection-valued path-expression// find the forum instance that contains Topic tQuery q2 = em.createQuery("SELECT f FROM Forum f " +"WHERE :topic MEMBER f.topics");q2.setParameter("topic", t);List results2 = q2.getResultList();


字符串函数(STRING FUNCTIONS)
JPQL查询的WHERE或HAVING语句中支持字符串函数作为函数表达式。


CONCAT(string 1, string 2):将字符串2追加到字符串1。

SUBSTRING(string, starting position, length):从字符串string开始位置starting position截取长度为length字符。

LOWER(string):将一个字符串string转换成小写形式。

UPPER(string):将一个字符串string转换成大写形式。

LENGTH(string):返回字符串string的长度,为整数。

TRIM([[LEADING|TRAILING|BOTH] [char] FROM] string):去掉字符串string头,尾或两者的字符char。最简形式是TRIM(string),可以去掉字符串string头尾的空格字符。

LOCATE(string1, string2 [,start]):返回string2在string1的位置。定位函数有一个可选的起始位置start。


数学函数(ARITHMETIC FUNCTIONS)
JPQL查询的WHERE或HAVING语句中支持数学函数作为函数表达式。


ABS(arithmetic expression):返回算术表达式的绝对值。

SQRT(arithmetic expression):求算术表达式的方根,返回一个Double。

MOD(arithmetic expression 1, arithmetic expression 2):求参数1与参数2的模,返回一个整数。

SIZE(collection-valued path-expression):计算一个集合中元素的数量,并返回一个整数。如果集合为空,返回0。


时间函数(DATETIME FUNCTIONS)
支持以下时间函数。


CURRENT_DATE:当时日期,由数据库决定。

CURRENT_TIME:当时时间,由数据库决定。

CURRENT_TIMESTAMP:当时日期和时间,由数据库决定




SECLECT函数
SELECT语句标识查询结果。SELECT语句包含一个或多个下列元素。


一个路径表达式或是标识变量:表明返回一个实体。

一个单值路径表达式:指定返回一个字段或实体。

一个统计SELECT表达式:表明返回计算结果(如,COUNT(*))。

一个构造器表达式:允许你从选择的条目中返回一个对象。

SELECT语句允许查询各种实体,计算结果,投影值,非实体类。你可以在SELECT语句中使用集合值的路径表达式,然而,下面表达是非法的。


SELECT f.topics FROM Forum f
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值