【发布时间】:2018-08-04 08:50:33
【问题描述】:
我有一个具有四个多对多关联的实体:
@Entity
@Table(name = "userInfo")
@NamedQueries({
@NamedQuery(name = "getFullUser", query = "select u " +
" from UserInfo u " +
" join fetch u.userImage ui " +
" join fetch u.logInfo " +
" join fetch u.userQuestions " +
" join fetch u.userPostsComments " +
" join fetch u.userPosts " +
" join fetch u.answers " +
" where u.userId = :id")
})
public class UserInfo {
public static final String GET_SMALL_USER = "getSmallUser";
public static final String GET_COMMON_USER = "getCommonUser";
public static final String GET_FULL_USER = "getFullUser";
public static final String DELETE_USER = "deleteUser";
public static final String FIND_USERS = "findUsers";
public static final String GET_USERS_BY_BIRTHDATE = "getUsersByBirthDate";
public static final String GET_USERS_EMAILS_BY_DATE = "getUsersEmailsByDate";
public static final String CHECK_USER = "checkUser";
private long userId;
private String email;
private String firstName;
private String lastName;
private long rating;
private Date createDate;
private java.sql.Date birthDate;
private List<Questions> userQuestions;
private List<PostsComments> userPostsComments;
private List<PostsInfo> userPosts;
private List<Answer> answers;
private UserImages userImage;
private LogInfo logInfo;
public UserInfo(){}
public UserInfo(String email, String firstName, String lastName, java.sql.Date birthDate){
this.email = email;
this.firstName = firstName;
this.lastName = lastName;
this.birthDate = birthDate;
}
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id", unique = true, nullable = false)
public long getUserId() {
return userId;
}
@Basic
@Column(name = "email")
public String getEmail() {
return email;
}
@Basic
@Column(name = "firstName")
public String getFirstName() {
return firstName;
}
@Basic
@Column(name = "lastName")
public String getLastName() {
return lastName;
}
@Basic
@Column(name = "rating")
public long getRating() {
return rating;
}
@Basic
@Column(name = "createDate")
@Temporal(TemporalType.DATE)
public Date getCreateDate() {
return createDate;
}
@OneToMany(mappedBy = "userInfo", cascade = {CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.LAZY)
@OrderColumn
public List<Questions> getUserQuestions() {
return this.userQuestions;
}
@OneToMany(mappedBy = "userInfo", cascade = {CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.LAZY)
@OrderColumn
public List<PostsComments> getUserPostsComments() {
return this.userPostsComments;
}
@OneToMany(mappedBy = "userInfo", cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@OrderColumn
public List<PostsInfo> getUserPosts() {
return this.userPosts;
}
@OneToMany(mappedBy = "userInfo", cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@OrderColumn
public List<Answer> getAnswers() {
return this.answers;
}
@OneToOne(cascade = CascadeType.ALL, mappedBy = "userInfo", fetch = FetchType.EAGER, orphanRemoval = true)
public UserImages getUserImage() {
return userImage;
}
@OneToOne(fetch = FetchType.LAZY, optional = false, mappedBy = "userInfo",
cascade = CascadeType.ALL)
public LogInfo getLogInfo() {
return logInfo;
}
@Column(name = "birthDate", nullable = false)
public java.sql.Date getBirthDate() {
return birthDate;
}
}
获得完整用户的代码:
@Override
public UserInfo getFullUser(long id) {
Query<UserInfo> query = session.createNamedQuery(UserInfo.GET_FULL_USER, UserInfo.class)
.setParameter("id", id);
UserInfo user = query.getSingleResult();
return user;
}
当我尝试获取完整用户时,休眠创建下一个 sql 查询:
Hibernate: select userinfo0_.user_id as user_id1_17_0_,
userimages1_.user_id as user_id1_16_1_,
loginfo2_.user_id as user_id1_4_2_,
userquesti3_.question_id as question1_13_3_,
userpostsc4_.post_comment_id as post_com1_8_4_,
userposts5_.post_id as post_id1_9_5_,
answers6_.answer_id as answer_i1_0_6_,
userinfo0_.birthDate as birthDat2_17_0_,
userinfo0_.createDate as createDa3_17_0_,
userinfo0_.email as email4_17_0_,
userinfo0_.firstName as firstNam5_17_0_,
userinfo0_.lastName as lastName6_17_0_,
userinfo0_.rating as rating7_17_0_,
userimages1_.image_l as image_l2_16_1_,
userimages1_.image_m as image_m3_16_1_,
userimages1_.image_s as image_s4_16_1_,
loginfo2_.mail_h as mail_h2_4_2_,
loginfo2_.pass_h as pass_h3_4_2_,
userquesti3_.createDate as createDa2_13_3_,
userquesti3_.title as title3_13_3_,
userquesti3_.user_id as user_id4_13_3_,
userquesti3_.user_id as user_id4_13_0__,
userquesti3_.question_id as question1_13_0__,
userquesti3_.userQuestions_ORDER as userQues5_0__,
userpostsc4_.comment as comment2_8_4_,
userpostsc4_.createDate as createDa3_8_4_,
userpostsc4_.post_id as post_id4_8_4_,
userpostsc4_.user_id as user_id5_8_4_,
userpostsc4_.user_id as user_id5_8_1__,
userpostsc4_.post_comment_id as post_com1_8_1__,
userpostsc4_.userPostsComments_ORDER as userPost7_1__,
userposts5_.createDate as createDa2_9_5_,
userposts5_.title as title3_9_5_,
userposts5_.user_id as user_id5_9_5_,
userposts5_.views as views4_9_5_,
userposts5_.user_id as user_id5_9_2__,
userposts5_.post_id as post_id1_9_2__,
userposts5_.userPosts_ORDER as userPost6_2__,
answers6_.question_id as question3_0_6_,
answers6_.text as text2_0_6_,
answers6_.user_id as user_id4_0_6_,
answers6_.user_id as user_id4_0_3__,
answers6_.answer_id as answer_i1_0_3__,
answers6_.answers_ORDER as answers_5_3__
from userInfo userinfo0_
inner join userImages userimages1_ on userinfo0_.user_id=userimages1_.user_id
inner join logInfo loginfo2_ on userinfo0_.user_id=loginfo2_.user_id
inner join Questions userquesti3_ on userinfo0_.user_id=userquesti3_.user_id
inner join postsComments userpostsc4_ on userinfo0_.user_id=userpostsc4_.user_id
inner join postsInfo userposts5_ on userinfo0_.user_id=userposts5_.user_id
inner join Answer answers6_ on userinfo0_.user_id=answers6_.user_id
where userinfo0_.user_id=?
并抛出此异常:
Exception in thread "main" javax.persistence.NoResultException: No entity found for query
at org.hibernate.query.internal.AbstractProducedQuery.getSingleResult(AbstractProducedQuery.java:1555)
at ru.projects.prog_ja.dao.Hibernate.HibernateUserDAOImpl.getFullUser(HibernateUserDAOImpl.java:72)
at TestMain.run(TestMain.java:56)
at TestMain.main(TestMain.java:20)
虽然我在表中有这个实体,但当我删除最后 4 个附加集合的连接提取时,一切正常。
我不明白我的错误在哪里,请帮助我
【问题讨论】:
-
可能其中一个连接返回空数据,因此您的查询不会返回任何数据。
标签: java hibernate jakarta-ee