java - Hibernate 'join' 获取奇怪的行为

标签 java hibernate join fetch

我有一个用户和一个消息表。用户到消息是一对多关系,消息到用户是多对一关系。我已将多对一之一标记为获取连接。当我“获取”单个消息时,Hibernate 运行联接查询,但是当我获取所有消息时,Hibernate 运行选择查询而不是联接。可能是什么原因?详情如下:

它们之间的关系:

用户

<set name="messagesForFromUserUid" lazy="true" table="message" inverse="true" cascade="save-update">
        <key>
            <column name="from_user_uid" not-null="true" />
        </key>
        <one-to-many class="repository.Message" />
    </set>
    <set name="messagesForToUserUid" lazy="true" table="message" fetch="select">
        <key>
            <column name="to_user_uid" not-null="true" />
        </key>
        <one-to-many class="repository.Message" />
    </set>

留言

<many-to-one name="userByFromUserUid" class="repository.User" fetch="join" lazy="false">
        <column name="from_user_uid" not-null="true" />
    </many-to-one>
    <many-to-one name="userByToUserUid" class="repository.User" fetch="select" lazy="proxy">
        <column name="to_user_uid" not-null="true" />
    </many-to-one>

当我获取单个消息对象时,Hibernate 按预期运行一个连接查询:

Message m = (Message) s.get(Message.class, 2);

Hibernate: 
select
    message0_.message_uid as message1_1_1_,
    message0_.from_user_uid as from2_1_1_,
    message0_.to_user_uid as to3_1_1_,
    message0_.message_text as message4_1_1_,
    message0_.created_dt as created5_1_1_,
    user1_.user_uid as user1_0_0_,
    user1_.user_name as user2_0_0_,
    user1_.user_password as user3_0_0_,
    user1_.email as email0_0_,
    user1_.first_name as first5_0_0_,
    user1_.last_name as last6_0_0_,
    user1_.created_dt as created7_0_0_ 
from
    hello.message message0_ 
inner join
    hello.user user1_ 
        on message0_.from_user_uid=user1_.user_uid 
where
    message0_.message_uid=?

但是当我一次性获取所有消息时,Hibernate 会运行选择查询:

List<Message> l = s.createQuery("from Message").list();

Hibernate: 
select
    message0_.message_uid as message1_1_,
    message0_.from_user_uid as from2_1_,
    message0_.to_user_uid as to3_1_,
    message0_.message_text as message4_1_,
    message0_.created_dt as created5_1_ 
from
    hello.message message0_
Hibernate: 
select
    user0_.user_uid as user1_0_0_,
    user0_.user_name as user2_0_0_,
    user0_.user_password as user3_0_0_,
    user0_.email as email0_0_,
    user0_.first_name as first5_0_0_,
    user0_.last_name as last6_0_0_,
    user0_.created_dt as created7_0_0_ 
from
    hello.user user0_ 
where
    user0_.user_uid=?

Hibernate: 
select
    user0_.user_uid as user1_0_0_,
    user0_.user_name as user2_0_0_,
    user0_.user_password as user3_0_0_,
    user0_.email as email0_0_,
    user0_.first_name as first5_0_0_,
    user0_.last_name as last6_0_0_,
    user0_.created_dt as created7_0_0_ 
from
    hello.user user0_ 
where
    user0_.user_uid=?

最佳答案

看起来 Hibernate 并不总是使用映射中定义的获取策略来进行 HQL 或 Criteria 查询。它们通常用于获取/加载。在这里找到引用:https://forum.hibernate.org/viewtopic.php?f=1&t=957561

关于java - Hibernate 'join' 获取奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9695597/

相关文章:

Java keytool 在 -list 期间抛出 OutOfMemoryError

java - Ehcache 与静态 map 缓存实现

java - 检查 Firestore 查询是否为空

java - Hibernate org.hibernate.LazyInitializationException : could not initialize

mysql - SQL - 来自多个表的信息,具有同一字段的两个变体。

api - 创建 Java Spring API 路由器

java - 为后台线程从 Hibernate 获取新 session

java - "mappedBy reference an unknown target entity property"使用 hibernate

MySQL 正确合并查询

Python "join"功能类似于 unix "join"