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年的限制,只需担心性能问题。但是,如果您需要将抽象类或接口与实现相链接,则可以这样做。