【问题标题】:jpa fetch join queryjpa fetch 连接查询
【发布时间】:2012-01-01 23:23:13
【问题描述】:

这是我的域的外观:

public class Template implements Serializable {
    private static final long serialVersionUID = 1L;    
    @OneToOne(cascade=CascadeType.ALL)
    private FieldConfig fieldConfig;
}

public class FieldConfig implements Serializable {
    private static final long serialVersionUID = 1L;

    @OneToMany(cascade= CascadeType.PERSIST)
    @JoinColumn(name = "fieldConfigId")
    private Set<Field> fieldSet;
}

如果我从数据库加载模板,自动加载 fieldConfig 和该 fieldconfig 的 fieldSet,我想实现。

我目前的 JPQL:

TypedQuery<Template> query = em.createQuery("SELECT t from Template t LEFT JOIN FETCH t.fieldConfig"
                + " fconfig LEFT JOIN FETCH fconfig.fieldSet where t.id = :id", Template.class);

我的例外:

Internal Exception: NoViableAltException(80@[()* loopback of 477:9: (node= join )*])
Exception Description: Syntax error parsing the query [SELECT t from Template t LEFT JOIN FETCH t.fieldConfig fconfig LEFT JOIN FETCH fconfig.fieldSet where t.id = :id], line 1, column 55: unexpected token [fconfig].

对创建这样的查询有什么想法吗?

【问题讨论】:

  • @Template@FieldConfig 是否在描述符中被注释为实体或配置?
  • 是的,当然,为了便于阅读,我没有包括它 :)
  • 这个查询对我来说是正确的。你的 JPA 引擎是什么?您是否尝试过使用 AS fconfig 来查看它是否有所作为?
  • 我正在使用 EclipseLink,尝试添加 AS got => 异常描述:语法错误解析查询 [SELECT t from Template t LEFT JOIN FETCH t.fieldConfig AS fconfig LEFT JOIN FETCH fconfig.fieldSet where t .id = :id],第 1 行,第 55 列:意外令牌 [AS]。

标签: java jpa jpa-2.0 jpql


【解决方案1】:

您不能在 JPQL 的连接提取中使用别名,这是规范不允许的。

EclipseLink 确实允许通过查询提示进行嵌套连接获取,

"eclipselink.join-fetch"="t.fieldConfig.fieldSet"

【讨论】:

  • TypedQuery
猜你喜欢
  • 2023-03-06
  • 2016-05-23
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
  • 2019-06-17
  • 1970-01-01
相关资源
最近更新 更多