Java JPA - 内部联接查询不起作用
Posted
技术标签:
【中文标题】Java JPA - 内部联接查询不起作用【英文标题】:Java JPA - Inner Join Query doesn't work 【发布时间】:2015-03-06 16:38:27 【问题描述】:我目前在使用带有 EclipseLink 的 Java JPA 时遇到问题 - 此查询:
SELECT VAR_INPUT.*
FROM VAR_INPUT
INNER JOIN TYPE_VAR_INPUT
ON VAR_INPUT.ID_TYPE_VAR_INPUT = TYPE_VAR_INPUT.ID_TYPE_VAR_INPUT
WHERE TYPE_VAR_INPUT.IS_MANDATORY_TYPE_VAR_INPUT=true;
直接在我的数据库上运行时工作正常,但当我将它与 JPA 一起使用时不起作用。
JPA 查询:
@NamedQuery(name = "VarInput.findAVarInputllOfMandatoryType",
query = "SELECT v "
+ "FROM VarInput v "
+ "INNER JOIN TypeVarInput t "
+ "ON v.ID_TYPE_VAR_INPUT = t.ID_TYPE_VAR_INPUT "
+ "WHERE t.isMandatoryTypeVarInput=:isMandatoryTypeVarInput"),
当我在我的 Java 应用程序中执行它时,我收到以下错误: “此表达式中的字段 [VAR_INPUT.ID_VAR_INPUT] 在此上下文中有一个无效的表。”
Exception in thread "AWT-EventQueue-0" Local Exception Stack:
Exception [EclipseLink-6069] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.QueryException
Exception Description: The field [VAR_INPUT.ID_VAR_INPUT] in this expression has an invalid table in this context.
Query: ReadAllQuery(name="VarInput.findAVarInputllOfMandatoryType" referenceClass=VarInput jpql="SELECT v FROM VarInput v INNER JOIN TypeVarInput t ON v.ID_TYPE_VAR_INPUT = t.ID_TYPE_VAR_INPUT WHERE t.isMandatoryTypeVarInput=:isMandatoryTypeVarInput")
at org.eclipse.persistence.exceptions.QueryException.invalidTableForFieldInExpression(QueryException.java:749) at org.eclipse.persistence.exceptions.QueryException.invalidTableForFieldInExpression(QueryException.java:749)
at org.eclipse.persistence.internal.expressions.FieldExpression.validateNode(FieldExpression.java:296)
我的表格是这样的:
Table VAR_INPUT(ID_VAR_INPUT, NAME_VAR_INPUT, ID_TYPE_VAR_INPUT)
Table TYPE_VAR_INPUT(ID_TYPE_VAR_INPUT, NAME_TYPE_VAR_INPUT, IS_MANDATORY_VAR_INPUT)
"VAR_INPUT ManyToOne TYPE_VAR_INPUT"
你知道为什么会这样吗?
注意:实体是由 NetBeans 生成的
【问题讨论】:
没有类就不可能匹配到 JPQL ......你不在 JPQL 中使用表/列名 修正小语法/拼写错误 【参考方案1】:您不会像那样在 JQPL 中使用 inner join
,而是加入实体字段。我现在猜是因为你没有提供实体代码,但试试这个
@NamedQuery(name = "VarInput.findAVarInputllOfMandatoryType",
query = "SELECT v "
+ "FROM VarInput v "
+ "join v.type t "
+ "WHERE t.isMandatoryTypeVarInput=:isMandatoryTypeVarInput")
在这种情况下你甚至不需要join,你可以将查询简化为this(隐式使用了inner join)
@NamedQuery(name = "VarInput.findAVarInputllOfMandatoryType",
query = "SELECT v "
+ "FROM VarInput v "
+ "WHERE v.type.isMandatoryTypeVarInput=:isMandatoryTypeVarInput")
【讨论】:
以上是关于Java JPA - 内部联接查询不起作用的主要内容,如果未能解决你的问题,请参考以下文章
将多条记录添加到数据库时,内部联接的 LINQ 查询不起作用
内部联接在使用 Spark 2.1 的 DataFrame 中不起作用