【问题标题】:Indexed element access in JPQLJPQL 中的索引元素访问
【发布时间】:2023-12-10 15:59:01
【问题描述】:

是否可以像HQL 那样在 JPQL 中进行索引元素访问:

select o from Order o where o.items[0].id = 1234

我在 JPA 2 规范中找不到相关内容,

我的目标是EclipseLink JPA,所以如果您想出一个 EclipseLink 解决方案,那也没关系,尽管首选 JPQL 标准解决方案。

【问题讨论】:

    标签: hibernate jpa hql eclipselink jpql


    【解决方案1】:

    INDEX 函数应该可以解决问题(实际上我测试过它确实如此):

    SELECT o
    FROM Order o JOIN o.items i
    WHERE i.id = 1234
    AND INDEX(i) = 0
    

    来自 JPA 2.0 规范(4.6.17.2.2 算术函数):

    INDEX 函数返回一个整数 对应位置的值 它的参数在有序列表中。这 INDEX 函数只能应用于 标识变量表示 订单列具有的类型 已指定。

    【讨论】:

      【解决方案2】:

      @Pascal Thivent 的答案是正确的。为了使INDEX() 工作,您还需要在实体的集合字段上添加@OrderedColumn

      小心,Hibernate 中有一个错误,导致INDEX() 无法按预期工作, 它不支持 @OrderedColumnmappedBy 一起使用: JPA 2.0 @OrderColumn annotation in Hibernate 3.5

      【讨论】: