如何在querydsl中加入外键

时间:2015-09-16 08:22:27

标签: java sql-server querydsl

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

我们有一个数据库,表格通过最少3列链接 我按照文档here进行了操作,最终得到了正确创建的模式。

这是我的伪表:

物品

  • Corporation(pk) mmcono
  • 项目编号(pk) mmitno
  • Environnement(pk) mmenv
  • 项目描述 mmitds

Item_warehouse

  • 公司(项目的fk) mbcono
  • 项目编号(项目的fk) mbitno
  • 环境(项目的fk) mbenv
  • 仓库编号 mbwhlo
  • 其他属性(不重要)

在Item_wharehouse类中,我手动添加了foreignKey(因为它没有在实际的db模式中定义)

 public final com.querydsl.sql.ForeignKey<QItemWharehouse > _ItemWharehouseFk = 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);
    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)

我最终想要的是允许连接表而无需手动指定连接条件所需的所有列。 如前所述,我的模型从pk中的最少3列开始,并且在on子句中有6或7个cols并不罕见!这是一个很多的打字和非常容易出错,因为你很容易错过一个并得到重复的结果。

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

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

我做错了什么?我错过了什么?是否有可能实现我想要的目标?

1 个答案:

答案 0 :(得分:0)

Oups我发现了问题:我错误地完成了所有操作。

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

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

你得到了你的好语句。这只是你如何构建关系的问题。

@Enigma,我真诚地希望它能帮助你度过周五下午。我不希望你的老板对你感到失望: - )