【问题标题】:Querydsl join on same table multiple timesQuerydsl多次加入同一张表
【发布时间】:2015-04-04 13:43:22
【问题描述】:

假设我有两个表TaskCompanyCompany 具有列 idnameTask 有两列 customerIdproviderId 链接回 idCompany

如何使用 Querydsl 加入 Company 表两次,以便获得 customerIdproviderId 指定的每个公司的 name

可能更好地解释我正在尝试的代码:

Configuration configuration = new Configuration(templates);
JPASQLQuery query = new JPASQLQuery(this.entityManager, configuration);

QTask task = QTask.task;
QCompany customer = QCompany.company;
QCompany provider = QCompany.company;

JPASQLQuery sql = query.from(task).join(customer).on(customer.id.eq(task.customerId))
    .join(provider).on(provider.id.eq(task.providerId));

return sql.list(task.id, customer.name.as("customerName"), provider.name.as("providerName"));

生成 SQL:

select task.id, company.name as customerName, company.name as providerName from task join company on company.id = task.customerId

我真的很希望这样:

select task.id, customer.name as customerName, provider.name as providerName from task join company as customer on customer.id = task.customerId join company as provider on provider.id = task.providerId

我不知道如何为要加入的表设置别名,以便区分客户名称和提供商名称。我尝试做new QCompany("company as provider"),但没有奏效。有谁知道如何做到这一点?

【问题讨论】:

    标签: java querydsl


    【解决方案1】:

    如果您需要变量,只需执行以下操作

    QCompany customer = new QCompany("customer");
    QCompany provider = new QCompany("provider");
    

    重新分配默认变量 QCompany.company 没有帮助

    【讨论】:

    • 感谢 Timo,但这会创建一个包含“客户”表和“提供者”表的查询。这些表不存在。这只是一张叫做公司的桌子。如果它能够做到“公司作为客户”和“公司作为供应商”,那就太好了。
    • 如果 QCompany 是一个基于 APT 的生成类,您的查询将不起作用,您需要在这种情况下使用 JPAQuery。 JPASQLQuery 用于使用此方法生成的具有 Q 类型的 SQL 查询querydsl.com/static/querydsl/3.6.1/reference/html/…
    • 太糟糕了,太糟糕了。这是故意的还是我可以开票的?
    • 这是故意的,但您可以为它开一张票。至少它应该有更好的记录。您是如何选择 JPASQLQuery 的?
    • 我使用的是 spring-data-jpa,所以我对所有内容都进行了注释,但我需要做一些报告,这些报告需要从一堆不一定以这种方式连接的东西中挑选出来JPAQuery 希望它们成为。所以 JPASQLQuery 看起来很好,我可以使用我的所有注释来生成类,但仍然可以在 sql 中使用外键连接事物,而不是在我的代码中创建完整的实体图。而且我可以只使用我已经设置的 EntityManager 而不是从中拉出连接来使用 SQLQuery。除了没有混叠之外,这一切都奏效了。
    猜你喜欢
    • 2014-03-05
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 2012-08-22
    • 1970-01-01
    相关资源
    最近更新 更多