【发布时间】:2012-08-21 08:01:03
【问题描述】:
以下命名查询
<named-query name="fix.getByProblem">
<query>
SELECT f
FROM Fix f JOIN f.solved s
WHERE s.id IN :ids
</query>
</named-query>
应该返回解决至少一个给定问题的所有修复程序,但失败并显示错误消息
异常描述:编译查询时出错[fix.getByProblem]:
SELECT f FROM Fix f JOIN f.solved s WHERE s.id IN :ids
],类 [ProblemHandle] 的未知状态或关联字段 [id]。
模型如下:(简化)
修复.java
@ElementCollection
@CollectionTable(name = "FIX_SOLVED", schema = SCHEMA_NAME, joinColumns = {@JoinColumn(name = "SOURCE_VERSION", referencedColumnName = "version")})
@AttributeOverrides({ @AttributeOverride(column = @Column(name = "SOLVED_ID", nullable = true), name = "id") })
private Collection<ProblemHandle> solved;
ProblemHandle.java
@Embeddable
@Access(AccessType.PROPERTY)
public class ProblemHandle {
private Long id;
...
}
问题.java
@Entity(name = Problem.ENTITY_NAME)
@Access(value = AccessType.FIELD)
@Table(name = Problem.TABLE_NAME, schema = Problem.SCHEMA_NAME)
@IdClass(ProblemHandle.class)
public class Problem {
public static final String ENTITY_NAME = "problem";
public static final String SCHEMA_NAME = "X";
public static final String TABLE_NAME = "PROBLEM";
@Id
@Column(name="id", nullable = false)
private Long id;
...
}
我怎样才能在不改变模式的情况下实现这一点,例如使用手柄?
【问题讨论】:
-
ProblemHandle类中除了id之外还有其他字段吗? -
尝试在 ProblemHandle 中标记@Transient over id FIELD。
-
感谢您的回复。 ProblemHandle 没有任何其他字段,但有两个私有常量。我试过@Transient,但没有任何效果。您对此有何想法?
-
如果你注释掉这一行:
@AttributeOverrides({ @AttributeOverride(column = @Column(name = "SOLVED_ID", nullable = true), name = "id") })那么它就可以了。 -
这也不会改变情况:-/
标签: jpa eclipselink jpql embeddable