Java 在JPA条件生成器中将不相关的实体左键联接到根表
我有两张表Java 在JPA条件生成器中将不相关的实体左键联接到根表,java,jpa,left-join,entitymanager,criteria-api,Java,Jpa,Left Join,Entitymanager,Criteria Api,我有两张表表A和表B。对于这两个表,我有两个实体类,名为TableA&TableB TableA有一个属性,它实际上是一个外键,是TableB的ID。但这种关系在表级和实体类级都不存在 这意味着这两个表与EntityManager无关 现在我想生成一个jpa查询,如下所示 select tablea.name, tableb.name from TableA tablea left join TableB tableb on tablea.tablebId=tableb
表A
和表B
。对于这两个表,我有两个实体类,名为TableA
&TableB
TableA有一个属性,它实际上是一个外键,是TableB的ID。但这种关系在表级和实体类级都不存在
这意味着这两个表与EntityManager无关
现在我想生成一个jpa查询,如下所示
select
tablea.name, tableb.name
from TableA tablea left join TableB tableb on
tablea.tablebId=tableb.pkId
基本上,表A是我的主表
这是我做的,这是交叉连接
String rootClassNameWithPackage = "TableA";
String fkClassNameWithPackage = "TableB";
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<?> criteriaQuery = null;
Root<?> rootTable = null;
Root<?> fkTable = null;
try {
criteriaQuery = criteriaBuilder.createQuery(String.class);
rootTable = criteriaQuery != null ? criteriaQuery.from(Class.forName(rootClassNameWithPackage)) : null;
fkTable = criteriaQuery != null ? criteriaQuery.from(Class.forName(fkClassNameWithPackage)) : null;
List<Predicate> criteriaList = new ArrayList<>();
Predicate predicateSearchFk = criteriaBuilder.equal(rootTable.get("tablebId"), fkTable.get("pkid"));
criteriaList.add(predicateSearchFk);
criteriaQuery.where(criteriaBuilder.and(criteriaList.toArray(new Predicate[0])));
} catch (ClassNotFoundException e) {
logger.error(e.getMessage());
}
final TypedQuery<?> query = entityManager.createQuery(criteriaQuery);
query.setMaxResults(pageSize);
return query.getResultList();
字符串rootClassNameWithPackage=“TableA”;
字符串fkClassNameWithPackage=“TableB”;
CriteriaBuilder CriteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery CriteriaQuery=null;
根根表=null;
根表=null;
试一试{
criteriaQuery=criteriaBuilder.createQuery(String.class);
rootTable=criteriaQuery!=null?criteriaQuery.from(Class.forName(rootClassNameWithPackage)):null;
fkTable=criteriaQuery!=null?criteriaQuery.from(Class.forName(fkClassNameWithPackage)):null;
List criteriaList=新建ArrayList();
谓词谓词谓词search fk=criteriaBuilder.equal(rootTable.get(“tablebId”)、fkTable.get(“pkid”);
criteriaList.add(predicateSearchFk);
其中(criteriaBuilder.and(criteriaList.toArray(新谓词[0]));
}catch(classnotfounde异常){
logger.error(例如getMessage());
}
final TypedQuery query=entityManager.createQuery(criteriaQuery);
query.setMaxResults(页面大小);
返回query.getResultList();
如前所述,这是交叉连接。我们想加入。遗憾的是,我们无法更改实体类以添加FK关系。您是否尝试使用显式连接类型,这是使其工作的唯一方法(假设您使用的是Hibernate)。使用vanilla JPATHER是不可能的,您可以选择使用本机查询或在本机查询之上构建的技术,如