当前位置: 首页 > 知识库问答 >
问题:

QueryDSL fetchJoin不提取数据

谷梁英毅
2023-03-14
long id

String someField

// No bidirectional linkage to B entity via hibernate
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:

long id

String someCField

// No bidirectional linkage to B entity via hibernate

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

所以我正在做这样的事情(我习惯于使用spring-data-jpa来(LEFT)JOIN FETCH属性,以避免按需惰性加载,防止向数据库触发无用的查询,我想在QueryDSL中做完全相同的事情)

    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()
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

b.getc()或b.geta(),我正在向数据库触发另一个查询,这是我首先要避免的事情。

我做错了什么?

共有1个答案

谢弘阔
2023-03-14

我认为,连接条件的定义是不恰当的。

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

@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;

    // ..
}

查询

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();

}
    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
 类似资料:
  • 我有下面的代码行来获取一个html文档使用jSoup 无论我使用什么标题,这都会超时。相同的网址: 当我在Chrome或火狐上打卡时,工作完全正常。我错过了什么?提前感谢所有的帮助。

  • 问题内容: 我有来自远程服务器的一些json,结果返回如下: 我如何获得a1和a2的值? 谢谢 问题答案: 使用如果数据仍然是字符串形式: 演示:http://jsfiddle.net/mattball/WK9gz/ 由于您使用jQuery的,换出了和jQuery将自动地解析JSON你。在回调内部,您将使用普通的JavaScript对象- 无需解析。

  • 主要内容:1. 创建提取,2. 应用提取过滤器,3. 将新数据添加到提取,4. 提取历史在Tableau中,数据提取从数据源创建数据子集。数据提取对于通过应用过滤器来提高性能非常有用。它还有助于使用Tableau的某些功能。可能在数据源中不可用,例如在数据中查找不同的值。但是,数据提取功能最常用于创建Tableau的脱机访问本地驱动器。 1. 创建提取 按照以下菜单提取数据:数据(Data) -> 提取数据(Extract Data)。 它创建了多个选项,例如对要提取的行数应用限制以

  • 我有以下查询和方法 使用< code >域作为 我希望这个查询能够获取

  • 问题内容: 我正在尝试使用fetch发布 JSON对象。 据我了解,我需要将一个字符串化的对象附加到请求的主体,例如: 使用jsfiddle的json回显时,我希望看到返回的对象(),但这不会发生-chrome devtools甚至不将JSON显示为请求的一部分,这意味着它没有被发送。 问题答案: 借助ES2017 支持,这是如何实现JSON负载的方法: 无法使用ES2017?参见@vp_art使

  • 我在使用LEFT JOIN FETCH时遇到了一个问题。请参考我下面的实体和存储库。 考虑一个场景,可选的课程不会在任何时间点从表中删除。但是学生信息可以被删除。数据库中的两个表之间没有主键和外键关系。只是我们有一个共同的栏目“学生ID”。 不带事务的服务方法: 具有事务性的服务方法: 尽管我使用了LEFT JOIN FETCH,但当我调用依赖实体(即oc)时,为什么在学生记录不存在的情况下(即学