【问题标题】:JPA/Hibernate: Can you create a join query on an specific MapKey?JPA/Hibernate:您可以在特定的 MapKey 上创建连接查询吗?
【发布时间】:2015-10-07 15:57:07
【问题描述】:

我想在一个特定 MapKey 条目的 Map 属性上使用连接来测试查询,但我还没有找到解决方案。有没有人完成过这样的查询并可以共享正确的 JPQL / HQL?

MapKey 列是enum 类型,值是另一个@Entity

这是模型:

@Entity
public class Operation {

    @Id
    private int id;

    @OneToMany(mappedBy = "operation", fetch = FetchType.LAZY)
    @Cascade(CascadeType.ALL)
    @MapKeyEnumerated(EnumType.STRING)
    private Map<OperationDetailsType, OperationDetails> operationDetails;
}

@Entity
public class OperationDetails {

    @Id
    private int id;

    private String details;

}

public enum OperationDetailsType { SHORT, FULL }

这是我目前尝试过的查询:

SELECT operation FROM Operation operation join operation.operationDetails['SHORT'] operationDetailsShort WHERE operationDetailsShort.details = :el1

我在 Hibernate Community 中找到了这个参考,但是使用 [...] 的方法会引发错误: https://forum.hibernate.org/viewtopic.php?f=1&t=1004884

org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: [ near line 1,...

休眠版本是:4.3.8.Final

谢谢

【问题讨论】:

    标签: hibernate jpa jpa-2.0


    【解决方案1】:

    在改变了搜索网络的方法后,我终于找到了一个可行的解决方案。

    重点是使用JOIN ... ON key() 查询。

    以下是运行此 JPA 查询的查询语法:

    SELECT operation FROM Operation operation
        JOIN operation.operationDetails operationDetailsShort ON key(operationDetailsShort) = 'SHORT'
      WHERE operationDetailsShort.details = :el1
    

    这种结构的好处是您可以针对特定的detailsOperationDetails 创建查询:(不用说这是一个高效的解决方案)

    SELECT operation FROM Operation operation
        JOIN operation.operationDetails operationDetailsShort ON key(operationDetailsShort) = 'SHORT'
        JOIN operation.operationDetails operationDetailsLong ON key(operationDetailsFull) = 'FULL'
      WHERE operationDetailsShort.details = :el1
        AND operationDetailsFull.details = :el2
    

    编辑:正如 Vlad Mihalcea 所提到的,hibernaes JOIN ... WITH 的 JPQL 等效项是 JOIN ... ON。我可以确认这也有效并更新了查询。

    【讨论】:

    • 只有一个观察。 WITH 是 HQL 关键字。 JPQL 等效项为 ON,它在生成的 SQL 中转换为 ON JOIN 条件。
    • 感谢您的信息。如果它也有效,我会尝试并更新答案
    • 不客气。 ON 已添加到 JPA 2.1,因此也值得一提。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 2020-01-26
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    相关资源
    最近更新 更多