【问题标题】:JPQL NamedQuery: Access attribute of an @Embeddable class from an @ElementCollection referenceJPQL NamedQuery:来自@ElementCollection 引用的@Embeddable 类的访问属性
【发布时间】: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


【解决方案1】:

你有@Access(AccessType.PROPERTY),所以你的属性名来自你的get方法,而不是变量。你的 get 方法叫什么名字?

尝试删除@Access(AccessType.PROPERTY)

另外,你用的是什么版本?尝试使用 2.4 版本。

【讨论】:

  • 我已经尝试将其删除并将其设置为 AccessType.FIELD(我认为这是默认设置),但它没有任何效果。 getter 称为 getId() 并且没有任何进一步的注释。我正在使用 EclipseLink 2.3,但不幸的是我目前无法切换到 2.4。我听说在 2.4 中,对象比较应该是可能的,所以它可能适用于“WHERE :ids MEMBER OF s”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 2013-12-31
  • 2014-01-12
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 2016-12-25
相关资源
最近更新 更多