join fetch无法在Hibernate查询语言中使用

时间:2017-02-27 09:58:43

标签: java hibernate jpa orm hql

我想检索一个数据库命中的所有记录,为此,我使用下面的连接提取语句是我的查询

String q = "SELECT oneChat from " + Chat.class.getName() + " oneChat "
                + " join fetch oneChat.user1 " 
                + " join fetch oneChat.user2 "
                + " join fetch oneChat.user3 "
                + " join fetch oneChat.groupData "
                + "where oneChat.dmlStatus != :dmlStatusValue"
                + " AND group_id = :groupIdValue" + " AND reference_id = 0"
                + " AND root_chat_id = oneChat.chatId";

我的表中总共有4个外键/连接,所以我添加了连接提取语句,但它没有工作,即如果我删除连接提取语句,我得不到任何结果,我得到了结果集。我对表连接的提取默认为Eager(没有将其更改为Lazy)。

此外,日志文件中没有sql语法错误。我错过了什么吗?

更新 这是因为第二个连接,即user2返回null,所以我没有得到任何数据。现在,如果有人能告诉我如何解决这个问题,那么查询应该是独立的,不应该依赖于数据。

1 个答案:

答案 0 :(得分:2)

如果您想要返回结果而不管依赖项中是否存在数据,那么您应该使用左连接而不是内连接(连接提取等于内连接提取):

"SELECT oneChat from " + Chat.class.getName() + " oneChat "
                + " left join fetch oneChat.user1 " 
                + " left join fetch oneChat.user2 "
                + " left join fetch oneChat.user3 "
                + " left join fetch oneChat.groupData "
                + "where oneChat.dmlStatus != :dmlStatusValue"
                + " AND group_id = :groupIdValue" + " AND reference_id = 0"
                + " AND root_chat_id = oneChat.chatId";

现在,当OneChat对数据库没有任何user2依赖关系时,无论如何,查询仍会返回结果。

如果您使用前缀,请尝试在where子句中为group_idroot_chat_id字段添加前缀。