4.8. 关于 HQL predicates
predicates 形成 where 子句、包含 子句 和 搜索案例表达式的基础。它们是可解析为真实值的表达式,通常是 TRUE 或 FALSE,尽管涉及 NULL 值的布尔值比较通常解析为 UNKNOWN。
HQL 谓词
null Predicate
检查 null 值。可以应用到基本属性引用、实体引用和参数。HQL 还允许将它应用到组件/嵌入式类型。
示例:NULL Check
// select everyone with an associated address select p from Person p where p.address is not null // select everyone without an associated address select p from Person p where p.address is null像 Predicate
执行类似于字符串值的比较。语法为:
like_expression ::= string_expression [NOT] LIKE pattern_value [ESCAPE escape_character]语义遵循 SQL 等表达式的语义。
pattern_value是在 string_expression 中尝试匹配的模式。正如 SQL 一样,mod_value可以使用_(下划线)和%(百分比)作为通配符。含义相同。_匹配任何单个字符。%匹配任意数量的字符。可选的s
cap_character用于指定用于转义pattern_value中_和%的特殊含义的转义字符。这在需要搜索模式(包括_ 或%)时非常有用。示例:LIKE Predicate
select p from Person p where p.name like '%Schmidt' select p from Person p where p.name not like 'Jingleheimmer%' // find any with name starting with "sp_" select sp from StoredProcedureMetadata sp where sp.name like 'sp|_%' escape '|'Predicate 间
类似于 SQL
BETWEEN表达式。执行评估,说明值在 2 个其他值范围内。所有操作对象都应具有可比较类型。示例:BETWEEN Predicate
select p from Customer c join c.paymentHistory p where c.id = 123 and index(p) between 0 and 9 select c from Customer c where c.president.dateOfBirth between {d '1945-01-01'} and {d '1965-01-01'} select o from Order o where o.total between 500 and 5000 select p from Person p where p.name between 'A' and 'E'IN Predicate
INpredicate 执行检查特定值是否在值列表中。它的语法是:in_expression ::= single_valued_expression [NOT] IN single_valued_list single_valued_list ::= constructor_expression | (subquery) | collection_valued_input_parameter constructor_expression ::= (expression[, expression]*)single_valued_expression 的类型和 single_valued_list 中的单个值必须一致。Java Persistence 查询语言将此处的有效类型限制为字符串、数字、日期、时间、时间戳和枚举类型。在 Java Persistence 查询语言 中,single_valued_expression 只能指:- "状态字段",这是简单属性的术语。特别是,这不包括关联和组件/嵌入式属性。
实体类型表达式.
在 HQL 中,
single_valued_expression 可以指一组更广泛的表达式类型。允许单值关联。同样是组件/嵌入式属性,尽管该功能取决于底层数据库中对元或"行值构造器语法"的支持级别。此外,HQL 不会以任何方式限制值类型,但应用开发人员应该意识到,不同的类型可能会基于底层数据库供应商获得有限的支持。这主要是 Java Persistence 查询语言限制的原因。值列表可能来自多个不同来源。在
constructor_expression和collection_valued_input_parameter中,值列表不能为空;它必须至少包含一个值。示例:IN Predicate
select p from Payment p where type(p) in (CreditCardPayment, WireTransferPayment) select c from Customer c where c.hqAddress.state in ('TX', 'OK', 'LA', 'NM') select c from Customer c where c.hqAddress.state in ? select c from Customer c where c.hqAddress.state in ( select dm.state from DeliveryMetadata dm where dm.salesTax is not null ) // Not Java Persistence query language compliant! select c from Customer c where c.name in ( ('John','Doe'), ('Jane','Doe') ) // Not Java Persistence query language compliant! select c from Customer c where c.chiefExecutive in ( select p from Person p where ... )