JPAQuery (QueryDSL) 中的非致命用户错误
nonfatal user error in JPAQuery (QueryDSL)
我必须使用 QueryDSL / JPAQuery 添加搜索功能。
搜索应使用 table 由父 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 - select count(distinct dossier_) from Dossier dossier_ left join dossier_.acties actie_ inner join actie_.organisatieStructuur organisatieStructuur_ on actie_.organisatieStructuur.id = organisatieStructuur_.id 其中 dossier_.deleted = ?1 和 organisatieStructuur_.ouder = ?2
org.apache.openjpa.persistence.ArgumentException:"Encountered "on" 在第 64 个字符处,但应为:[",", "GROUP", "HAVING", "INNER", "JOIN"、"LEFT"、"ORDER"、"WHERE"、]。”在解析 JPQL 时“select count(distinct dossier_)
来自档案档案_
左加入 dossier_.acties actie_
在 actie_.organisatieStructuur.id = organisatieStructuur_.id 上内部加入 actie_.organisatieStructuur organisatieStructuur_
其中 dossier_.deleted = ?1 和 organisatieStructuur_.ouder = ?2".
[2 月 9 日添加:]
域模型(仅显示包含字段的第一部分,其他 getter/setter 方法因大小而未显示):
@Entity
public class Dossier extends AbstractEntity implements Serializable, HasCommunicaties {
private static final String SHAREPOINT_NR_FORMAT = "{0,number,0000}/{1,number,00}";
@Version
private long version;
private int jaar;
private int volgNummer;
private Status status;
public enum Status {
OPEN, AFGESLOTEN;
}
@Temporal(TemporalType.TIMESTAMP)
private Date datumStatus;
@NotNull
@Column(length = 5000)
@Size(max = 5000)
private String beschrijvingVaststelling;
@Column(length = 5000)
@Size(max = 5000)
private String oorzaakVaststelling;
@ManyToOne
private ZorgDomein zorgDomein;
@ManyToOne(fetch = FetchType.LAZY)
@NotNull
private Bron bron;
@ManyToOne
private KernWaarde kernWaarde;
private String pdca;
@Valid
@OneToMany(mappedBy = "dossier", cascade = CascadeType.ALL, orphanRemoval = true)
@Size(min = 1)
private List<PlaatsVaststelling> plaatsVaststellingen = new ArrayList<PlaatsVaststelling>();
@ManyToOne(fetch = FetchType.LAZY)
private Proces proces;
@NotNull
private String beheerder;
@Temporal(TemporalType.DATE)
@Past
private Date datumVaststelling;
@ManyToOne(fetch = FetchType.LAZY)
private TypeVaststelling typeVaststelling;
@ManyToOne(fetch = FetchType.LAZY)
private Prioritering prioritering;
@ManyToOne(fetch = FetchType.LAZY)
private AuditRapport auditRapport;
@OneToMany(mappedBy = "dossier", cascade = CascadeType.ALL)
@OrderBy("volgnummer")
@Valid
private List<Actie> acties = new ArrayList<Actie>();
@OneToMany(mappedBy = "dossier")
@OrderBy("datum desc")
private List<Communicatie> communicaties = new ArrayList<Communicatie>();
@OneToMany(mappedBy = "dossier", cascade = CascadeType.ALL)
@OrderBy("datum desc")
private List<Historiek> historieks = new ArrayList<Historiek>();
private boolean vertrouwelijk;
@ElementCollection
private List<String> beheerders = new ArrayList<String>();
@ElementCollection
private List<String> lezers = new ArrayList<String>();
private boolean mailPVAVerstuurd;
private Date datumAanpakTegen;
private boolean deleted;
这个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 关系的实体名称的原因。
我必须使用 QueryDSL / JPAQuery 添加搜索功能。 搜索应使用 table 由父 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 - select count(distinct dossier_) from Dossier dossier_ left join dossier_.acties actie_ inner join actie_.organisatieStructuur organisatieStructuur_ on actie_.organisatieStructuur.id = organisatieStructuur_.id 其中 dossier_.deleted = ?1 和 organisatieStructuur_.ouder = ?2
org.apache.openjpa.persistence.ArgumentException:"Encountered "on" 在第 64 个字符处,但应为:[",", "GROUP", "HAVING", "INNER", "JOIN"、"LEFT"、"ORDER"、"WHERE"、]。”在解析 JPQL 时“select count(distinct dossier_) 来自档案档案_ 左加入 dossier_.acties actie_ 在 actie_.organisatieStructuur.id = organisatieStructuur_.id 上内部加入 actie_.organisatieStructuur organisatieStructuur_ 其中 dossier_.deleted = ?1 和 organisatieStructuur_.ouder = ?2".
[2 月 9 日添加:] 域模型(仅显示包含字段的第一部分,其他 getter/setter 方法因大小而未显示):
@Entity
public class Dossier extends AbstractEntity implements Serializable, HasCommunicaties {
private static final String SHAREPOINT_NR_FORMAT = "{0,number,0000}/{1,number,00}";
@Version
private long version;
private int jaar;
private int volgNummer;
private Status status;
public enum Status {
OPEN, AFGESLOTEN;
}
@Temporal(TemporalType.TIMESTAMP)
private Date datumStatus;
@NotNull
@Column(length = 5000)
@Size(max = 5000)
private String beschrijvingVaststelling;
@Column(length = 5000)
@Size(max = 5000)
private String oorzaakVaststelling;
@ManyToOne
private ZorgDomein zorgDomein;
@ManyToOne(fetch = FetchType.LAZY)
@NotNull
private Bron bron;
@ManyToOne
private KernWaarde kernWaarde;
private String pdca;
@Valid
@OneToMany(mappedBy = "dossier", cascade = CascadeType.ALL, orphanRemoval = true)
@Size(min = 1)
private List<PlaatsVaststelling> plaatsVaststellingen = new ArrayList<PlaatsVaststelling>();
@ManyToOne(fetch = FetchType.LAZY)
private Proces proces;
@NotNull
private String beheerder;
@Temporal(TemporalType.DATE)
@Past
private Date datumVaststelling;
@ManyToOne(fetch = FetchType.LAZY)
private TypeVaststelling typeVaststelling;
@ManyToOne(fetch = FetchType.LAZY)
private Prioritering prioritering;
@ManyToOne(fetch = FetchType.LAZY)
private AuditRapport auditRapport;
@OneToMany(mappedBy = "dossier", cascade = CascadeType.ALL)
@OrderBy("volgnummer")
@Valid
private List<Actie> acties = new ArrayList<Actie>();
@OneToMany(mappedBy = "dossier")
@OrderBy("datum desc")
private List<Communicatie> communicaties = new ArrayList<Communicatie>();
@OneToMany(mappedBy = "dossier", cascade = CascadeType.ALL)
@OrderBy("datum desc")
private List<Historiek> historieks = new ArrayList<Historiek>();
private boolean vertrouwelijk;
@ElementCollection
private List<String> beheerders = new ArrayList<String>();
@ElementCollection
private List<String> lezers = new ArrayList<String>();
private boolean mailPVAVerstuurd;
private Date datumAanpakTegen;
private boolean deleted;
这个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 关系的实体名称的原因。