Java 未找到我的查询的Hibernate实体
我有一个实体,有四个多对多协会:Java 未找到我的查询的Hibernate实体,java,hibernate,jakarta-ee,Java,Hibernate,Jakarta Ee,我有一个实体,有四个多对多协会: @Entity @Table(name = "userInfo") @NamedQueries({ @NamedQuery(name = "getFullUser", query = "select u " + " from UserInfo u " + " join fetch u.userImage ui " + " join fetch u
@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;
}
}
并引发此异常:
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个连接集合的连接回迁时,所有这些都可以正常工作
我不明白我的错误在哪里,请帮助我您正在查询中使用内部联接。只有当每个联接表都有数据时,才会得到结果。这意味着您的查询只会在您的用户有:userImage、logInfo、userQuestions 下面的示例显示了3个表。只有user1和user2在所有表中都有条目。但是user3在LOGDATA表中没有条目
USERTABLE
userid name age
user1 Peter 20
user2 Hartmut 60
user3 Waltraud 85
LOGTABLE
userid logtext
user1 uploaded data
user2 posted message
POSTABLE
userid message subject
user1 Hello World javascript
user2 Hello Foo java
user3 Old World cobol
如果使用内部联接联接所有表:
SELECT * FROM USERDATA
INNER JOIN POSTDATA ON USERDATA.userid = POSTDATA.userid
INNER JOIN LOGDATA ON USERDATA.userid = LOGDATA.userid
您将获得:
userid name age userid message subject userid logtext
user1 Peter 20 user1 Hello World javascript user1 uploaded data
user2 Hartmut 60 user2 Hello Foo java user2 posted message
对于您的用例,您应该使用外部连接。对于exmaple查询:
SELECT * FROM USERDATA
FULL OUTER JOIN POSTDATA ON USERDATA.userid = POSTDATA.userid
FULL OUTER JOIN LOGDATA ON USERDATA.userid = LOGDATA.userid
将导致:
userid name age userid message subject userid logtext
user1 Peter 20 user1 Hello World javascript user1 uploaded data
user2 Hartmut 60 user2 Hello Foo java user2 posted message
user3 Waltraud 85 user3 Old World cobol NULL NULL
可能其中一个连接返回空数据,因此您的查询不会返回任何数据。
SELECT * FROM USERDATA
FULL OUTER JOIN POSTDATA ON USERDATA.userid = POSTDATA.userid
FULL OUTER JOIN LOGDATA ON USERDATA.userid = LOGDATA.userid
userid name age userid message subject userid logtext
user1 Peter 20 user1 Hello World javascript user1 uploaded data
user2 Hartmut 60 user2 Hello Foo java user2 posted message
user3 Waltraud 85 user3 Old World cobol NULL NULL