Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPAQuery(jpql)从抽象类到具体类的连接_Java_Hibernate_Jpa_Jpql - Fatal编程技术网

Java JPAQuery(jpql)从抽象类到具体类的连接

Java JPAQuery(jpql)从抽象类到具体类的连接,java,hibernate,jpa,jpql,Java,Hibernate,Jpa,Jpql,也许是一个简单的问题: abstract class Contact class ContactOffice extends Contact class ContactUser extends Contact 这是设置,现在我正在尝试搜索office的特定名称 new JPAQuery().from(recipient).innerJoin(recipient.recipient(),QContact.contact) 现在我需要在Contact和ContactOffice之间建立链接。

也许是一个简单的问题:

abstract class Contact

class ContactOffice extends Contact

class ContactUser extends Contact
这是设置,现在我正在尝试搜索office的特定名称

new JPAQuery().from(recipient).innerJoin(recipient.recipient(),QContact.contact)
现在我需要在Contact和ContactOffice之间建立链接。

我试过:

.innerJoin(recipient.recipient(),QContactOffice.contactOffice._super)
但这就产生了这样的结果:

  inner join treat(notaRecipient.recipient as ContactOffice) as contactOffice
他抱怨


任何建议都将不胜感激。

显然,这个问题似乎还有点未被探讨,或未得到实施。

我选择的解决方案是在存储库中执行本机查询。
优点是我可以控制整个查询,通常这是最快的方式,因为我也可以跳过T_联系人,直接转到T_联系人用户和T_联系人办公室,因为id是唯一的

编辑: 虽然我第一次得到了一些好的结果,但我在子句中遇到了一个问题,因为这个本地查询实际上是一个子查询,可以返回2000多个对象,而DB驱动程序不允许这样做

但也有好消息

我让JpaSubQuery工作,您需要创建路径,否则您无法使用
BooleanBuilder
进行查询,后面我的例子就是这样

new JPASubQuery().from(recipient)
                    .innerJoin(recipient.nota(), QNota.nota)
                    .leftJoin(recipient.recipient().as(QContactUser.class).user(), QLightUser.lightUser)
                    .leftJoin(recipient.recipient().as(QContactOffice.class).office(), QOffice.office)
                    .leftJoin(recipient.recipient().as(QContactExternal.class).external(), QExternal.external)
                    .where(predicateBuilder).distinct()
                    .list(recipient.nota())));
正如您所见,我可以使链接正确,这就是我搜索的方式:

predicateBuilder.and(recipient.recipient().as(QContactUser.class).user().firstName.containsIgnoreCase(query.getToUser())
                        .or(recipient.recipient().as(QContactUser.class).user().lastName.containsIgnoreCase(query.getToUser())));
因为现在完整的查询将进入数据库,所以我不必担心2000年的限制,只需担心性能问题。
但是,如果您需要将抽象类或接口与实现相链接,则可以这样做。