Mysql JPQL,如果值为IN或NULL,则搜索
我在使用JPQL时遇到问题 我的问题是: 从表t中选择[columns] 其中[条件]和t.aColumn.aSubColumn在[值]中 或t.aColumn为空 为了解释它,t包含一个列,它是另一个表的外键,因此是一个对象。我试图查看该表的字段是否包含一些值,但如果外键为null,则在查询中不考虑它。我怎样才能做到这一点 PS:当我尝试运行查询时,结果为null,因为FK为null,所以在in子句中找不到任何内容 编辑:原始查询 @NamedQueryname=Commande.findCustom,query=SELECT c FROM Commande c WHERE +c.idChargement类似:idChargement或c.idChargement为空且 +c.codetransporter-LIKE:codetransporter或c.codetransporter为空且 +c.dateChargementPrevu介于:DateFirst和:dateFin之间;或 +c.dateChargementPrevu为空或 +c.dateLivraisonPrevue介于:Date处女和:dateFin之间;或 +c.dateLivraisonPrevue为空且 +c.idDernierStatut.idListStatutCommande IN +从Listestatutscommande l中选择l.idListeStatutsCommande +其中:idStatut或c.idDernierStatut中的l.idStatut为NULL,且 +c.raisonSocialeDestinataire LIKE:raisonSociale或c.raisonSocialeDestinataire为NULL且 +c.adresestinataire LIKE:adresestinataire或c.adresestinataire为空且 +c.codedistinataire LIKE:codedistinataire或c.codedistinataire为空且 +c.codePostalDestinataire-LIKE:codePostal或c.codePostalDestinataire为空且 +c.villeDestinataire LIKE:villeDestinataire或c.villeDestinataire为空且 +c.paysDestinataire类似:codePays或c.paysDestinataire为空且 +c.idPartenaire IN:idPartenaire +由c.dateLivraisonPrevue DESC订购 当您使用t.aColumn时,则在后台使用内部联接。试试这个Mysql JPQL,如果值为IN或NULL,则搜索,mysql,sql,jakarta-ee,jpa,jpql,Mysql,Sql,Jakarta Ee,Jpa,Jpql,我在使用JPQL时遇到问题 我的问题是: 从表t中选择[columns] 其中[条件]和t.aColumn.aSubColumn在[值]中 或t.aColumn为空 为了解释它,t包含一个列,它是另一个表的外键,因此是一个对象。我试图查看该表的字段是否包含一些值,但如果外键为null,则在查询中不考虑它。我怎样才能做到这一点 PS:当我尝试运行查询时,结果为null,因为FK为null,所以在in子句中找不到任何内容 编辑:原始查询 @NamedQueryname=Commande.findCu
SELECT [columns] FROM Table t left join t.aColumn ac
WHERE [conditions] AND ac.aSubColumn IN ([values])
添加实际使用的查询后更新
@NamedQuery(name = "Commande.findCustom", query = "SELECT c FROM Commande c left join c.idDernierStatut idds WHERE "
+ "(c.idChargement LIKE :idChargement OR c.idChargement IS NULL) AND "
+ "(c.codeTransporteur LIKE :codeTransporteur OR c.codeTransporteur IS NULL) AND "
+ "(((c.dateChargementPrevu BETWEEN :dateDebut AND :dateFin) OR "
+ "c.dateChargementPrevu IS NULL) OR "
+ "((c.dateLivraisonPrevue BETWEEN :dateDebut AND :dateFin) OR "
+ "c.dateLivraisonPrevue IS NULL)) AND "
+ "(idds is null or idds.idListeStatutsCommande IN "
+ "(SELECT l.idListeStatutsCommande FROM Listestatutscommande l "
+ "WHERE l.idStatut IN :idStatut)) AND "
+ "(c.raisonSocialeDestinataire LIKE :raisonSociale OR c.raisonSocialeDestinataire IS NULL) AND "
+ "(c.adresseDestinataire LIKE :adresseDestinataire OR c.adresseDestinataire IS NULL) AND "
+ "(c.codeDestinataire LIKE :codeDestinataire OR c.codeDestinataire IS NULL) AND "
+ "(c.codePostalDestinataire LIKE :codePostal OR c.codePostalDestinataire IS NULL) AND "
+ "(c.villeDestinataire LIKE :villeDestinataire OR c.villeDestinataire IS NULL) AND "
+ "(c.paysDestinataire LIKE :codePays OR c.paysDestinataire IS NULL) AND "
+ "c.idPartenaire IN :idPartenaire "
+ "ORDER BY c.dateLivraisonPrevue DESC")
你能发布你正在测试的真实查询吗?因为如果select子句中有t.aColumn,那么也将强制使用内部联接。此外,您可以打印生成的SQL以查看到底发生了什么。这是我在编辑之前首先做的,它不起作用。我找到了一个解决办法,我在DB中放置了一个后插入触发器,以放置至少一行,这意味着他将有一行,并在子句中找到一些内容。我编辑了我的建议,添加了idds为null或。如果这不起作用,我就没有主意了。它也不起作用。但它并没有改变我原来的查询,是吗?它是不同的,因为它对c.idDernierStatut使用左连接,后者使用别名idds。此外,idds为null检查是在or表达式中的第一个,这意味着当idds为null时,不应计算in条件。