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

    IN predicate 执行检查特定值是否在值列表中。它的语法是:

    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_expressioncollection_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 ...
      )

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部