首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QueryDSL fetchJoin不获取数据。

QueryDSL fetchJoin不获取数据。
EN

Stack Overflow用户
提问于 2021-03-11 14:37:10
回答 1查看 1K关注 0票数 0

我所面对的问题是:

假设我有3个这样的实体:

实体A:

代码语言:javascript
复制
long id

String someField

// No bidirectional linkage to B entity via hibernate

实体B:

代码语言:javascript
复制
long id

String someBField

@ManyToOne(optional = false, fetch = FetchType.LAZY)
@JoinColumn(name="b_id")
A entityA

@ManyToOne(optional = true, fetch = FetchType.LAZY)
@JoinColumn(name="b_id")
C entityC;   

实体C:

代码语言:javascript
复制
long id

String someCField

// No bidirectional linkage to B entity via hibernate

现在,我们的目标是(为了简单起见,有一些排序和筛选,但这不影响我的问题)返回所有B记录,每一个有A和C记录的

因此,我正在做这样的事情(我习惯使用spring jpa to (左)连接,获取属性以避免按需加载延迟,以防止向数据库发出无用的查询,并且我希望在QueryDSL中执行完全相同的操作)

代码语言:javascript
复制
    JPAQuery<DealBo> query = new JPAQuery<>(entityManager);

    query.select(qB)
            .from(qB)
            .innerJoin(qA).on(qA.a_id.eq(qB.id)).fetchJoin()
            .innerJoin(qC).on(qC.a_id.eq(qB.id)).fetchJoin()
            .fetch()

我希望有一个sure在select子句中包含来自所有3个表(实体)的数据,其中QueryDSL (或Hibernate,我不完全确定哪个工具将执行SQL ->实体映射)将结果映射到实体对象。但我真正得到的是选择

代码语言:javascript
复制
select b.id, b.someBfield from b
inner join a // join clause is right and omitted for simplicity
inner join b // join clause is right and omitted for simplicity

因此,当我调用一个项目时,例如QueryDSL返回的内容

b.getC()或b.getA(),我将向数据库触发另一个查询,首先要避免的是什么。

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-13 14:39:13

我认为,联接条件的定义是不适当的。

希望我已经用UserEntity <- UserRoleEntity -> RoleEntity重新创建了所描述的星座:

代码语言:javascript
复制
@Entity
@Table(name = "t_user")
public class UserEntity {

    @Id
    @Column(name = "id")
    private Integer id;
    @Column(name = "name") 

    // ..
}

@Entity
@Table(name = "t_user_role")
public class UserRoleEntity {
    @Id
    @Column(name = "id")
    private Integer id;
    @ManyToOne
    @JoinColumn(name = "user_id")
    private UserEntity user;
    @ManyToOne
    @JoinColumn(name = "role_id")
    private RoleEntity role;

    // ..
}

@Entity
@Table(name = "t_role")
public class RoleEntity {
    @Id
    @Column(name = "id")
    private Integer id;
    @Column(name = "name")
    private String name;

    // ..
}

查询

代码语言:javascript
复制
List<UserRoleEntity> findAll() {
    JPAQuery<UserRoleEntity> query = new JPAQuery<>(entityManager);

    return query.select(QUserRoleEntity.userRoleEntity)
            .from(QUserRoleEntity.userRoleEntity)
            .innerJoin(QUserRoleEntity.userRoleEntity.user).fetchJoin()
            .innerJoin(QUserRoleEntity.userRoleEntity.role).fetchJoin()
            .fetch();

}

获取关联的表,并且在用户关联上进行的后续迭代不会从数据库加载用户实体。

生成的SQL如下所示

代码语言:javascript
复制
    select 
        userroleen0_.id as id1_5_0_, 
        userentity1_.id as id1_4_1_, 
        roleentity2_.id as id1_2_2_, 
        userroleen0_.role_id as role_id2_5_0_, 
        userroleen0_.user_id as user_id3_5_0_, 
        userentity1_.name as name2_4_1_, 
        roleentity2_.name as name2_2_2_ 
    from t_user_role userroleen0_ 
    inner join t_user userentity1_ on userroleen0_.user_id=userentity1_.id 
    inner join t_role roleentity2_ on userroleen0_.role_id=roleentity2_.id
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66584704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档