【问题标题】:Hibernate not found entity for my queryHibernate 没有为我的查询找到实体
【发布时间】: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


【解决方案1】:

您在查询中使用了内部联接。如果每个连接的表都有数据,您只会得到一个结果。这意味着您的查询只有在您的用户具有以下条件时才会命中:userImage、logInfo、userQuestions ...

以下示例显示 3 个表。只有 user1user2 在所有表中都有条目。但是 user3 在 LOGDATA-Table 中没有条目。

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

对于您的用例,您应该使用 OUTER-JOIN。例如查询:

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

【讨论】:

    猜你喜欢
    • 2014-10-26
    • 2021-10-21
    • 2015-09-14
    • 1970-01-01
    • 2017-12-26
    • 2017-06-24
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多