Atr*_*opo 5 java hibernate jpa hibernate-criteria
我有这Entity门课:
@Entity
public class Registered implements Serializable {
@Id
public RegisteredId id;
}
Run Code Online (Sandbox Code Playgroud)
有了这个EmbeddedId:
@Embeddable
public class RegisteredId implements Serializable {
@ManyToOne
public User user;
@ManyToOne
public Tournament tournament;
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试获取Criteria query和User,Tournament因为我需要读取它们的一些属性:
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();
Run Code Online (Sandbox Code Playgroud)
但我收到一个错误:
Execution exception[[CompletionException: java.lang.IllegalArgumentException: Unable to locate Attribute with the the given name [id.user] on this ManagedType
Run Code Online (Sandbox Code Playgroud)
我做错了什么?我怎样才能获取关系来EmbeddedId访问它们?
尝试用
@Embeddable
public class RegisteredId implements Serializable {
public Long userId;
public Long tournamentId;
}
Run Code Online (Sandbox Code Playgroud)
和
@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;
}
Run Code Online (Sandbox Code Playgroud)
进而
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();
Run Code Online (Sandbox Code Playgroud)