我使用的是Querydsl 2.9、Spring Data JPA 1.3.0和Hibernate JPA 2 API 1.0版。我试图在两个表父
和子
之间进行简单的连接,连接到parentId
列。由于某些原因,Hibernate执行的查询中总是有一个额外的交叉连接
。这些表格如下所示:
CREATE TABLE PARENT (
PARENTID INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(255)
);
CREATE TABLE CHILD (
CHILDID INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
PARENTID INT(11),
NAME VARCHAR(255)
);
@Entity
@Table(name="PARENT")
public class Parent {
@Id
@GeneratedValue
private Integer parentId;
private String name;
@OneToMany
@JoinColumn(name="parentId")
private List<Child> children;
// ... getters/setters omitted for brevity
}
@Entity
@Table(name="CHILD")
public class Child {
@Id
@GeneratedValue
private Integer childId;
private Integer parentId;
private String name;
// ... getters/setters omitted for brevity
}
private List<Parent> test(List<Integer> parentIds) {
JPAQuery query = new JPAQuery(entityManagerFactory.createEntityManager());
QParent qParent = QParent.parent;
QChild qChild = QChild.child;
List<Parent> parents = query.from(qParent, qChild)
.innerJoin(qParent.children, qChild)
.where(qParent.parentId.in(parentIds))
.list(qParent);
return parents;
}
select
p.parentId, p.name
from
parent p
inner join
child c on c.parentid = p.parentid
where
p.parentid in(1, 2);
但是,实际运行的查询是这样的:
select
parent0_.parentId as parentId1_3_, parent0_.name as name2_3_
from
PARENT parent0_
inner join
CHILD children2_ ON parent0_.parentId = children2_.parentId
cross join
CHILD child1_
where
parent0_.parentId in (1 , 2);
请注意结尾处额外的交叉连接
。我意识到,如果在childid
上执行组by
可以得到正确的结果,但我不希望在不需要的情况下增加交叉连接
的额外开销。我尝试同时使用innerjoin
和join
但都没有用。我已经浏览了Querydsl文档,我可以看到默认的连接类型是交叉连接,所以也许我没有正确指定我的连接?我如何摆脱额外的交叉连接?
第二个from参数可能是交叉连接的原因。
试试这个
List<Parent> parents = query.from(qParent)
.innerJoin(qParent.children, qChild)
.where(qParent.parentId.in(parentIds))
.list(qParent);
我在添加嵌套字段对象时遇到了一个Spring JPARepository的问题。 //模型 为什么它为排序添加?
我希望为结果提供内容过滤。我的(为简洁起见而编辑)实体如下所示: 节点: 场景: 来源: 下面是我希望实现的筛选器的一个示例。 给定一个SourceTypes集合,我希望选择所有场景,这样每个场景都会被其中一个类型的源引用。我使用QueryDSL和以下谓词实现了这一点: 一系列这些谓词被组合起来给出一个整体查询。即使只选择一个SourceType,结果查询看起来也是这样: 我相信上面发生的是交叉连
主要内容:笛卡尔积前面所讲的查询语句都是针对一个表的,但是在关系型数据库中,表与表之间是有联系的,所以在实际应用中,经常使用多表查询。多表查询就是同时查询两个或两个以上的表。 在 MySQL 中,多表查询主要有交叉连接、内连接和外连接。由于篇幅有限,本节主要讲解交叉连接查询。内连接和外连接将在《 MySQL内连接》和《 MySQL外连接》中讲解。 交叉连接(CROSS JOIN)一般用来返回连接表的笛卡尔积。 本节
问题内容: 我正在尝试从表中的每个元素中提取所有对对,而该表是同一张表中的每个元素,这是我的查询: 我处于只需要一半记录的情况。我的天真尝试是: 但我无法在插入时查询目标表,如SQL Server所述: 我怎样才能有效地做到呢? 编辑 仅供参考,我说:“我需要一半的记录”,这是错误的,在服用后账户记录计数是 问题答案: 因此,只需对连接进行条件调整,以使左侧始终等于或小于左侧!
我有如下所述格式的数据,其中我需要使用的所有变量要么是要么是变量的名称,并且我需要将NAs更改为0,将字符串更改为1。我尝试使用和,但返回的都是1。我现在唯一有效的解决方案是对每一个变量进行单独的变异。 如何同时跨多个变量将所有s更改为0,将所有字符串更改为1?
而且 现在的问题是: > 我必须如何在ALL_ORDERS子查询的底部执行联接?我已经尝试了以下操作: null 感谢任何帮助。