【问题标题】:QueryDsl cross join returns zero elementsQueryDsl 交叉连接返回零个元素
【发布时间】:2013-08-13 23:49:44
【问题描述】:

您好,我对 querydsl(+hibernate 4.2.3 和 postgresql)有点卡住了。通常它工作得很好,但是我有一个这样构建的谓词:

QUser user = QUser.user;
....
predicate = and(predicate,
                user.userType.in(userTypes)
                .or(user.customer.userType.in(userTypes)));

现在的问题是用户并不总是有客户。 Querydsl 生成与客户表交叉连接的 sql,当用户没有客户时,此查询返回零条目,即使应该返回这些条目。该客户已离开联接(稍微修改了 spring 数据以允许联接获取字段),但它仍然创建了额外的交叉联接。任何想法如何编写这样的查询?

【问题讨论】:

    标签: hibernate querydsl


    【解决方案1】:

    我希望 user.customer 遍历创建附加连接。

    下面的查询应该可以工作

    query.from(user)
         .leftJoin(user.customer, customer)
         .where(user.userType.in(userTypes).or(customer.userType.in(userTypes)));
    

    【讨论】:

    • 您好,感谢您的想法。我知道左连接会起作用,但问题是在我使用 PathBuilder 构建动态查询然后将该构造的谓词传递给此方法以进一步按 userTypes 过滤,然后将该谓词传递给 spring 数据存储库 listAll() 方法。我对其进行了一些修改以获取我的字段。但它是这样完成的: fetchQuery.leftJoin(builder.get(fetchField)).fetch();我用它通过提供带有 fetchField 名称的字符串列表来轻松获取一些字段。这帮助我避免了延迟初始化异常。
    • 所以问题是我不知道如何使用连接获取的客户,因为谓词是与查询执行分开构建的。
    • 你需要给它一个别名才能引用它:leftJoin(property, alias).fetch()
    猜你喜欢
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多