当前位置: 首页 > 知识库问答 >
问题:

JPA CriteriaBuilder是否为没有关系的表左外部联接?

景恩
2023-03-14
SELECT ve.col_1,
  (SELECT vm.col_4
  FROM table2 vm
  WHERE vm.col_2  = ve.col_2
  AND vm.col_3 = ve.col_3
  ) as col_a
FROM table1 ve;
SELECT ve.col_1,
  vm.col_4 as col_a
FROM table1 ve,
  table2 vm
WHERE 
vm.col_2 (+)    = ve.col_2 
AND vm.col_3 (+) = ve.col_3;

现在表1和表2没有使用外键的直接关系。对应的JPA实体如下所示:

Table1.java ->

@Column(name = "COL_1")
private String col_1;

@Column(name = "COL_2")
private String col_2;

@Column(name = "COL_3")
private String col_3;

@OneToOne(fetch = FetchType.LAZY)
@JoinColumns({
    @JoinColumn(name="COL_2"),
    @JoinColumn(name="COL_3")
})
private Table2 table2;


Table2.java ->

@Column(name = "COL_4")
private String col_4;

@Column(name = "COL_2")
private String col_2;

@Column(name = "COL_3")
private String col_3;

我的代码看起来像:

final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();

final CriteriaQuery<SearchTO> query = criteriaBuilder.createQuery(
        SearchTO.class);
Root<Table1> root = query.from(Table1.class);

final Join<Table1, Table2> joinTable2 = root.join(Table1_.table2,
        JoinType.LEFT);

则尝试使用以下方法获取值:

joinTable2.get(Table2_.col_4)
A Foreign key refering com.Table2 from com.Table1 has the wrong number of column

Table2有大约6列带有@id注释,而我不能将它更改为只有两列带有@id注释。

请告诉我:

>

  • 如果有可能为我的方法1(select子句中的子查询)使用CriteriaBuilder编写代码

    请注意,我使用的是普通的JPAAPI。DB是Oracle11g。JDK版本为1.7。

  • 共有1个答案

    薛宇
    2023-03-14

    方法一:可以为条件查询写子查询

    Subquery<Entity1> subquery = cq.subquery( Entity1.class );
        Root fromSubQuery = subquery.from( Entity1.class );
        subquery.select( cb.max( fromSubQuery.get( "startDate" ) ) );
        subquery.where( cb.equal( fromSubQuery.get( "xyzId" ), fromRootOfParentQuery.get( "xyzId" ) ) );
    

    将其用作:

    Root<Entity2> entity2 = cq.from( Entity2.class );
    Predicate maxDatePredicate = cb.and( cb.equal( entyty2.get( "startDate" ), subquery ) );
    

    对于方法2:除了在两个实体之间建立关系之外,没有其他方法可以进行左联接。您可以为没有getter和setter的关系定义私有变量,并使用该变量设置左联接。然后将谓词添加到criteriaBuilder

     类似资料:
    • 问题内容: 很容易理解为什么左外部联接不是可交换的,但是我很难理解它们是否是可交换的。几家在线资源表明不是,但我还没有说服自己就是这种情况。 假设我们有三个表:A,B和C。 令A包含ID和B_ID两列,其中ID是表A的主键,B_ID是与表B的主键相对应的外键。 令B包含两列ID和C_ID,其中ID是表B的主键,C_ID是与表C的主键相对应的外键。 让C包含ID和VALUE两列,其中ID是表C的主键

    • 问题内容: 这个问题已经在这里有了答案 : SQL中左右联结与左右联结之间的区别[重复] (4个答案) 6年前关闭。 我看到过称为LEFT OUTER JOIN或RIGHT OUTER JOIN的联接。在某些地方,我见过LEFT JOIN或RIGHT JOIN。我对此感到困惑。 我两天前发布了一个问题,但我无法理解解决方案提供的链接。 这些连接类型是否相同,或者两者之间有区别? 问题答案: 两者之

    • 我正在尝试JPA2.1(eclipselink)中的“treat as”函数,但遇到了一个来自JPA的错误: 异常说明:ReportQuery结果大小不匹配。应为[263],但已检索到[197] 下面是我的JPQL查询(我更改了一些部分,以便更明确): 我们可以看到account和ad_account之间的左外部连接。此外,ad_account表不存在于select子句中。(idApp字段是主键的

    • 无论B表中是否有匹配的记录,左外连接都应该从左表中获取所有数据,但如果左表的right_id列为空,则不能获取记录。 我在解释更多 我发现了这个, HQL支持两种形式的关联连接:隐式和显式。 上一节中显示的查询都使用显式形式,即在from子句中显式使用join关键字。这是推荐的表格。

    • 问题内容: 我正在尝试使用以下查询获取每天打开的页面数。 我得到的输出是这样的: 问题是,在我的日表中,我有一列包含数字1到30来代表一个月中的日子。我进行了左外部连接,希望在天数列中显示所有天数! 但是我的查询正在这样做,为什么会这样呢? 谢谢大家的帮助。 问题答案: Nanne给出的答案解释了为什么您没有得到期望的结果(您的WHERE子句删除了行),但是却没有解决方法。 解决方案是将WHERE

    • 问题内容: 我在基于放置过滤条件的位置的查询中基于过滤条件得到不同的结果。我的问题是: 这些查询之间在技术上有区别吗? SQL标准中是否有任何内容可以解释与查询不同的记录集? 在简化的情况下: 我以为查询将返回相同的结果集,而当它们没有返回时,我感到很惊讶。我使用的是MS SQL2005,在实际查询中,查询1返回了约700行,查询2返回了约1100行,但我无法检测到返回行和排除行的模式。查询1中仍