我是querydsl的新手,我正在尝试在纯java中使用querydsl(没有hibernate,JPA或其他任何东西)。
我们有一个数据库,表格通过最少3列链接 我按照文档here进行了操作,最终得到了正确创建的模式。
这是我的伪表:
物品
Item_warehouse
在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
的第二个参数。
我做错了什么?我错过了什么?是否有可能实现我想要的目标?
答案 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,我真诚地希望它能帮助你度过周五下午。我不希望你的老板对你感到失望: - )