也许简单的问题:
abstract class Contact
class ContactOffice extends Contact
class ContactUser extends Contact
这是设置,现在我正在尝试搜索特定的办公室名称。
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
他抱怨(
任何建议都会感激不尽。
答案 0 :(得分:0)
显然这个问题似乎还有点未开发或未实现。
我选择的解决方案是在存储库中进行本机查询 优点是我可以控制完整的查询,通常这是最快的方式,因为我也可以跳过T_CONTACT并直接转到T_CONTACT_USER和T_CONTACT_OFFICE,因为id是唯一的。
虽然我第一次得到了一些好的结果,但我遇到了in
子句的问题,因为这个本机查询实际上是一个子查询,可以返回超过2000个对象,而DB驱动程序不允许这样做。 / p>
但也有好消息。
我让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限制,只有性能问题
但是,如果您需要将抽象类或接口与实现相关联,那么就可以这样做。