如何使用 ManyToOne 映射在字段上编写 Hibernate 会话查询 JOIN 不相关实体
How to write Hibernate Session Query JOIN Unrelated Entities on Field with ManyToOne mapping
我有一个 grails 3.3.2 项目,我正在使用 Hibernate 5.1。5.Final,我已经将一些 JPA 实体 classes 映射到现有的 Oracle tables。我可以使用 Hibernate 创建一个会话查询,如果第二个实体没有将第一个实体引用为 ManyToOne 联接列映射,我可以在两个 table 上获得 return 查询结果,没有任何问题。如果我使用该列创建实体作为 ManyToOne 映射而不是字符串,我在尝试 运行 查询时会出错。
这是尝试执行查询时的错误。
原因:org.hibernate.hql.internal.ast.InvalidWithClauseException: with 子句只能引用驱动 table [select t.term 中的列作为术语
来自 edu.utica.jpa.entity.general.validation.Term t
加入 edu.utica.jpa.entity.ar.MealPlanDeadline pd ON pd.term = t.term
其中 pd.deadline 不为空]
这是当前形式的查询,如果“pd.term”在其实体 class.
中映射为字符串而不是 ManyToOne 关系,则该查询有效
List getMealPlanTerms() {
List terms = []
Term.withSession{ session ->
Query query = session.createQuery("""select t.term as term
from Term t
JOIN MealPlanDeadline pd ON pd.term = t.term
where pd.deadline is not null""")
query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE)
terms = query.list()
}
}
MealPlanDeadline 实体中术语的当前映射 class
@ManyToOne
@JoinColumns([
@JoinColumn(name = "TYRCMPD_TERM", referencedColumnName = "STVTERM_CODE")
])
Term term
如果改为这样映射,则查询有效,return符合我的预期。
@Column(name = "TYRCMPD_TERM")
String term
有没有人知道如何让它与 ManyToOne 样式的连接列一起工作?
谢谢
我只是用 tables/classes 另一个方向重写了这个并且它起作用了。但我不完全确定为什么它以这种方式而不是另一种方式工作。可能与 MealPlanDeadline class 上的 ManyToOne 映射有关。在 SQL 中,两个方向都可以正常工作,所以这几乎像是休眠中的一个错误。或者只是愚蠢的行为。
List getMealPlanTerms() {
List terms = []
Term.withSession{ session ->
Query query = session.createQuery("""select t.term as term
,t.description as description
,t.startDate as startDate
,t.endDate as endDate
,t.aidYear as aidYear
,t.acyr as acyr
,t.id as id
,t.version as version
from MealPlanDeadline pd
JOIN Term t ON t.term = pd.term
where pd.deadline is not null
""")
query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE)
terms = query.list()
}
}
你试过吗?
Query query = session.createQuery("""select t.term as term
,t.description as description
,t.startDate as startDate
,t.endDate as endDate
,t.aidYear as aidYear
,t.acyr as acyr
,t.id as id
,t.version as version
from MealPlanDeadline pd
JOIN Term t ON t.term.id = pd.term.id
where pd.deadline is not null
""")
如果这不起作用,您将不得不使用 Hibernate 5.2+,它增加了对这种用法的支持。
我有一个 grails 3.3.2 项目,我正在使用 Hibernate 5.1。5.Final,我已经将一些 JPA 实体 classes 映射到现有的 Oracle tables。我可以使用 Hibernate 创建一个会话查询,如果第二个实体没有将第一个实体引用为 ManyToOne 联接列映射,我可以在两个 table 上获得 return 查询结果,没有任何问题。如果我使用该列创建实体作为 ManyToOne 映射而不是字符串,我在尝试 运行 查询时会出错。
这是尝试执行查询时的错误。
原因:org.hibernate.hql.internal.ast.InvalidWithClauseException: with 子句只能引用驱动 table [select t.term 中的列作为术语 来自 edu.utica.jpa.entity.general.validation.Term t 加入 edu.utica.jpa.entity.ar.MealPlanDeadline pd ON pd.term = t.term 其中 pd.deadline 不为空]
这是当前形式的查询,如果“pd.term”在其实体 class.
中映射为字符串而不是 ManyToOne 关系,则该查询有效 List getMealPlanTerms() {
List terms = []
Term.withSession{ session ->
Query query = session.createQuery("""select t.term as term
from Term t
JOIN MealPlanDeadline pd ON pd.term = t.term
where pd.deadline is not null""")
query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE)
terms = query.list()
}
}
MealPlanDeadline 实体中术语的当前映射 class
@ManyToOne
@JoinColumns([
@JoinColumn(name = "TYRCMPD_TERM", referencedColumnName = "STVTERM_CODE")
])
Term term
如果改为这样映射,则查询有效,return符合我的预期。
@Column(name = "TYRCMPD_TERM")
String term
有没有人知道如何让它与 ManyToOne 样式的连接列一起工作?
谢谢
我只是用 tables/classes 另一个方向重写了这个并且它起作用了。但我不完全确定为什么它以这种方式而不是另一种方式工作。可能与 MealPlanDeadline class 上的 ManyToOne 映射有关。在 SQL 中,两个方向都可以正常工作,所以这几乎像是休眠中的一个错误。或者只是愚蠢的行为。
List getMealPlanTerms() {
List terms = []
Term.withSession{ session ->
Query query = session.createQuery("""select t.term as term
,t.description as description
,t.startDate as startDate
,t.endDate as endDate
,t.aidYear as aidYear
,t.acyr as acyr
,t.id as id
,t.version as version
from MealPlanDeadline pd
JOIN Term t ON t.term = pd.term
where pd.deadline is not null
""")
query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE)
terms = query.list()
}
}
你试过吗?
Query query = session.createQuery("""select t.term as term
,t.description as description
,t.startDate as startDate
,t.endDate as endDate
,t.aidYear as aidYear
,t.acyr as acyr
,t.id as id
,t.version as version
from MealPlanDeadline pd
JOIN Term t ON t.term.id = pd.term.id
where pd.deadline is not null
""")
如果这不起作用,您将不得不使用 Hibernate 5.2+,它增加了对这种用法的支持。