如何在querydsl中加入外键

How to join on foreign key in querydsl

我是 querydsl 的新手,我正在尝试在纯 java 中使用 querydsl(没有休眠、JPA 或任何东西)。

我们有一个数据库,其中 table 通过 最少 3 列 链接 我遵循了文档 here 并最终正确创建了我的模式。

这是我的伪 tables :

项目

Item_warehouse

在 Item_wharehouse class 中,我手动添加了 foreignKey(因为它没有在实际的数据库架构中定义)

 public final com.querydsl.sql.ForeignKey<QItemWharehouse > _ItemWharehouseFk = createInvForeignKey(Arrays.asList(mbitno, mbcono, mbenv), Arrays.asList("mmitno", "mmcono", "mbenv"));

我正在我的主 class 中编写以下代码:

    SQLTemplates templates = SQLServer2012Templates.builder().printSchema().build();
    Configuration configuration = new Configuration(templates);

    QItem mm = new QItem ("mm");
    QItemWarehouse mb = new QItemWarehouse("mb");

    JtdsDataSource ds = getDataSource();
    SQLQueryFactory queryFactory = new SQLQueryFactory(configuration, ds);
    String toto = queryFactory.select(mm.mmitno, mm.mmitds)
            .from(mm)
            .join(  ???????????? )
            .where(mb.mbwhlo.eq("122"))
            .fetch()

根据文档 here 我应该可以做这样的事情:AbstractSQLQuery.innerJoin(ForeignKey<E> key, RelationalPath<E> entity)

我最终想要的是允许连接table而不必手动指定连接条件所需的所有列。 如前所述,我的模型从 pk 中的最少 3 列开始,并且在 on 子句中有 6 或 7 列的情况并不少见!需要大量输入并且很容易出错,因为您很容易漏掉一个并得到重复的结果。

我想要 .join(mb._ItemWharehouseFk, ???) 之类的东西,让 querydsl 处理一些小细节,比如为我生成 on 子句。

我的问题是找不到连接方法的 RelationalPath<E> entity 类型的第二个参数。

我做错了什么?我想念什么?甚至可以实现我想要的吗?

哎呀,我发现了问题:我的顺序都错了。

外键位于 itemWarehouse class 中。 它应该这样命名:

public final com.querydsl.sql.ForeignKey<QItem> _ItemFk = createInvForeignKey(Arrays.asList(mbitno, mbcono, mbenv), Arrays.asList("mmitno", "mmcono", "mbenv"));

这意味着您只需要以这种方式颠倒语句中的顺序即可:

SQLTemplates templates = SQLServer2012Templates.builder().printSchema().build();
Configuration configuration = new Configuration(templates);

QItem mm = new QItem ("mm");
QItemWarehouse mb = new QItemWarehouse("mb");

JtdsDataSource ds = getDataSource();
SQLQueryFactory queryFactory = new SQLQueryFactory(configuration, ds);
List<Tuple> toto = queryFactory.select(mm.mmitno, mm.mmitds)
        .from(mb)
        .join(mb._ItemFk, mm )
        .where(mb.mbwhlo.eq("122"))
        .fetch()

然后你就得到了你的 nice on 子句。这只是你如何构建关系的问题。

@Enigma,我真诚地希望它能对你周五下午有所帮助。我不想让你的老板对你失望:-)