Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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 在JPA条件生成器中将不相关的实体左键联接到根表_Java_Jpa_Left Join_Entitymanager_Criteria Api - Fatal编程技术网

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是不可能的,您可以选择使用本机查询或在本机查询之上构建的技术,如