我想检索一个数据库命中的所有记录,为此,我使用下面的连接提取语句是我的查询
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,所以我没有得到任何数据。现在,如果有人能告诉我如何解决这个问题,那么查询应该是独立的,不应该依赖于数据。
答案 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_id
和root_chat_id
字段添加前缀。