JPAQuery中的非致命用户错误(QueryDSL)

JPAQuery中的非致命用户错误(QueryDSL),jpa,querydsl,Jpa,Querydsl,我必须使用QueryDSL/JPAQuery添加一个搜索函数。 搜索应使用由父ID组成的表: ID LABEL P_ID 1 A null 2 AB 1 3 ABC 2 一个简单的SQL语句给出了正确的结果: SELECT * FROM ACT JOIN ORG DEPT ON ACT.ORGID = DEPT.ID JOIN ORG DEPT2 ON DEPT.P_ID = DEPT2.ID WHERE DEPT.P_ID = 123 我面

我必须使用QueryDSL/JPAQuery添加一个搜索函数。 搜索应使用由父ID组成的表:

ID   LABEL  P_ID
1    A      null 
2    AB     1
3    ABC    2
一个简单的SQL语句给出了正确的结果:

SELECT * FROM ACT
JOIN ORG DEPT ON ACT.ORGID = DEPT.ID
JOIN ORG DEPT2 ON DEPT.P_ID = DEPT2.ID
WHERE DEPT.P_ID = 123
我面临的问题是,我必须使用现有的查询对象创建相应的QueryDSL/JPAQuery

我的密码是:

query.join(act.org, dept).on(act.org.id.eq(dept.id)).where(dept.org.parent.eq(123));
在我的查询之前和之后,其他语句修改查询对象。 这会导致以下错误:

O DEBUG JPAQuery-从档案档案左连接档案中选择计数(不同档案),其中档案被删除=?1,而档案被删除=?2

org.apache.openjpa.persistence.ArgumentException:“在字符64处遇到”on“,但应为:[“,”,“组”,“有”,“内部”,“连接”,“左”,“顺序”,“其中”,]”解析JPQL时“选择计数(不同的档案)” 从档案_ 左连接档案活动_ actie.organizatiestruur.id=organizatiestruur.id上的内部连接actie.organizatiestruur organizatiestruur 其中,档案被删除=?1,组织结构被删除=?2“

[于2月9日增补: 域模型(仅显示包含字段的第一部分,其他getter/setter方法因大小原因未显示):

@实体
公共类档案扩展了AbstractEntity,实现了可序列化的HasCommunications{
私有静态最终字符串SHAREPOINT_NR_FORMAT=“{0,number,0000}/{1,number,00}”;
@版本
私人长版;
内贾尔私人酒店;
沃尔格努默私人酒店;
私人身份;
公共枚举状态{
开着,阿弗格斯洛滕;
}
@时态(TemporalType.TIMESTAMP)
私人日期日期状态;
@NotNull
@柱(长度=5000)
@尺寸(最大值=5000)
私有字符串beschrijvingstelling;
@柱(长度=5000)
@尺寸(最大值=5000)
私有字符串oorzaakVaststelling;
@许多酮
私人佐尔格多明;
@manytone(fetch=FetchType.LAZY)
@NotNull
私人布隆;
@许多酮
私人克恩瓦德·克恩瓦德;
私有字符串pdca;
@有效的
@OneToMany(mappedBy=“dossier”,cascade=CascadeType.ALL,orphan=true)
@尺寸(最小值=1)
私有列表plaatsVaststellingen=new ArrayList();
@manytone(fetch=FetchType.LAZY)
私人程序;
@NotNull
私用线绳;
@时态(TemporalType.DATE)
@过去的
私人日期日期;
@manytone(fetch=FetchType.LAZY)
私用打字机打字机录音机录音机录音机录音机录音机录音机录音机录音机录音机录音机录音机录音机录音机录音机录音机录音机录音机录音机录音机录音机录音机录音机录音机录音机录音机录音机录音机;
@manytone(fetch=FetchType.LAZY)
私人优先权;
@manytone(fetch=FetchType.LAZY)
私人审计关系;
@OneToMany(mappedBy=“dossier”,cascade=CascadeType.ALL)
@订购人(“沃格努默”)
@有效的
private List acties=new ArrayList();
@OneToMany(mappedBy=“档案”)
@订货人(“基准描述”)
私有列表通信=新建ArrayList();
@OneToMany(mappedBy=“dossier”,cascade=CascadeType.ALL)
@订货人(“基准描述”)
private List historieks=new ArrayList();
私有布尔vertrouwelijk;
@元素集合
private List beheerders=new ArrayList();
@元素集合
private List lezers=new ArrayList();
私有布尔mailpvarverstuurd;
私人日期Datumanpaktegen;
删除私有布尔值;
此SQL

SELECT * FROM ACT
JOIN ORG DEPT ON ACT.ORGID = DEPT.ID
JOIN ORG DEPT2 ON DEPT.P_ID = DEPT2.ID
WHERE DEPT.P_ID = 123
可通过以下方式表达:

QAct act = QAct.act;
QOrg dept = new QOrg("dept");
QOrg dept2 = new QOrg("dept2");
query.from(act)
     .join(act.org, dept)
     .join(dept.p, dept2)
     .where(dept2.p.id.eq(123))
     .list(act);

我不知道如何将SQL映射到您的域模型,这就是为什么我使用了接近SQL关系的实体名称。

我得到的印象是不支持join方法。因为我使用.join(…)我看到了非致命错误。您的域模型是什么样子的?已用域模型更新。我接受您的SO答案,认为它有效且正确,但我也尝试过。查询编译并运行良好,但返回的结果与普通SQL查询不相同。我已通过在表中添加一个额外列修复了此问题,因此无需加入任何联接.
QAct act = QAct.act;
QOrg dept = new QOrg("dept");
QOrg dept2 = new QOrg("dept2");
query.from(act)
     .join(act.org, dept)
     .join(dept.p, dept2)
     .where(dept2.p.id.eq(123))
     .list(act);