【问题标题】:Hibernate criteria query fetch with embedded id带有嵌入式 id 的休眠条件查询获取
【发布时间】:2018-04-20 03:46:13
【问题描述】:

我有这个Entity 类:

@Entity
public class Registered implements Serializable {

    @Id
    public RegisteredId id;
}

有了这个EmbeddedId

@Embeddable
public class RegisteredId implements Serializable {
    @ManyToOne
    public User user;
    @ManyToOne
    public Tournament tournament;

}

我试图让这个Criteria query 获取UserTournament,因为我需要读取它们的一些属性:

CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Registered> criteria = builder.createQuery(Registered.class);
Root<Registered> root = criteria.from(Registered.class);
root.fetch("id.user", JoinType.LEFT);
root.fetch("id.tournament", JoinType.LEFT);
criteria.where(builder.equal(root.get("id.tournament.id"), idTournament));
List<Registered> registereds = em.createQuery(criteria).getResultList();

但我收到一个错误:

Execution exception[[CompletionException: java.lang.IllegalArgumentException: Unable to locate Attribute  with the the given name [id.user] on this ManagedType

我做错了什么? 如何获取 EmbeddedId 上的关系以访问它们?

【问题讨论】:

  • 您是否尝试将变量提取为root.alias("id") 并获取它? Selection&lt;Registered&gt; id = root.alias("id"); id.fetch("user", JoinType.LEFT);?

标签: java hibernate jpa hibernate-criteria


【解决方案1】:

试试

@Embeddable
public class RegisteredId implements Serializable {
    public Long userId;
    public Long tournamentId;
}

@Entity
public class Registered implements Serializable {

    @EmbeddedId
    public RegisteredId id;

    @ManyToOne
    @JoinColumn(name = "userId", updatable = false, insertable = false)
    public User user;
    @ManyToOne
    @JoinColumn(name = "tournamentId", updatable = false, insertable = false)
    public Tournament tournament;
}

然后

CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Registered> criteria = builder.createQuery(Registered.class);
Root<Registered> root = criteria.from(Registered.class);
root.fetch("user", JoinType.LEFT);
root.fetch("tournament", JoinType.LEFT);
criteria.where(builder.equal(root.get("id.tournamentId"), idTournament));
List<Registered> registereds = em.createQuery(criteria).getResultList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-27
    • 2012-03-17
    • 2014-09-24
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    相关资源
    最近更新 更多