如何在querydsl中加入外键
How to join on foreign key in querydsl
我是 querydsl 的新手,我正在尝试在纯 java 中使用 querydsl(没有休眠、JPA 或任何东西)。
我们有一个数据库,其中 table 通过 最少 3 列 链接
我遵循了文档 here 并最终正确创建了我的模式。
这是我的伪 tables :
项目
- 公司(pk)mmcono
- 商品编号(pk)mmitno
- 环境(pk)mmenv
- 物品描述mmitds
Item_warehouse
- 公司(项目 fk)mbcono
- 项目编号(项目的 fk)mbitno
- 环境(项目的 fk)mbenv
- 仓库编号mbwhlo
- 其他属性(不重要)
在 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,我真诚地希望它能对你周五下午有所帮助。我不想让你的老板对你失望:-)
我是 querydsl 的新手,我正在尝试在纯 java 中使用 querydsl(没有休眠、JPA 或任何东西)。
我们有一个数据库,其中 table 通过 最少 3 列 链接 我遵循了文档 here 并最终正确创建了我的模式。
这是我的伪 tables :
项目
- 公司(pk)mmcono
- 商品编号(pk)mmitno
- 环境(pk)mmenv
- 物品描述mmitds
Item_warehouse
- 公司(项目 fk)mbcono
- 项目编号(项目的 fk)mbitno
- 环境(项目的 fk)mbenv
- 仓库编号mbwhlo
- 其他属性(不重要)
在 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,我真诚地希望它能对你周五下午有所帮助。我不想让你的老板对你失望:-)