我现在正努力用Java代码编写JPA查询。 我正在尝试执行以下实际上非常简单的SQL:
select * from MYTABLE where PRRE_ID in (select PRRE_ID_NEGATION from MYTABLE_RELATION where PRRE_ID in (100200720,100200940,100200900));
我有一张桌子,桌子本身具有多对多关系。该表的一个项目可以与子表相同的任何数量的项目。关系存储在MYTABLE_RELATION中。
上面的SQL应该给我所有与给定数量的其他条目相关的条目(子级)。 到目前为止,我最大的尝试是
CriteriaBuilder cb = hibernateDao.getCriteriaBuilder();
CriteriaQuery<MyTable> query = cb.createQuery(MyTable.class);
Root<MyTable> root = query.from(MyTable.class);
query.select(root);
Subquery<Long> subquery = query.subquery(Long.class);
Root<MyTable> rootSub = subquery.from(MyTable.class);
subquery.select(rootSub.<Long>get(MyTable.PRRE_ID_NEGATION));
subquery.where(rootSub.get(BusinessEntity.PROPERTY_PK).in(valuesOfTheParentMyTablePKs));
query.where(cb.in(root.get(BusinessEntity.PROPERTY_PK)).value(subquery));
List<MyTable> resultList =
return hibernateDao.createQuery(query).getResultList();
所以MyTable在某种程度上是实体。 PK是主键,PRRE_ID_NEGATION是“其他”主键(关系)。 底层的休眠状态知道该关系。当我正常加载Entity并访问子项时,它工作得很好。但是在这个选择中,我只想直接让孩子得到,而没有父母本身。
以上代码创建了ORA-00936。 子选择不包含有效的sql:
... select . from ...
这个点让我发疯... 我很喜欢这种简单的SQL对我来说很难用Java JPA代码来完成...
代码库是一个很旧的代码库。请宁愿解释一下我可能会错过的内容,但是我无法轻松更改休眠模型(基于XML并已生成)。