Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql JPQL,如果值为IN或NULL,则搜索_Mysql_Sql_Jakarta Ee_Jpa_Jpql - Fatal编程技术网

Mysql JPQL,如果值为IN或NULL,则搜索

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

我在使用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时,则在后台使用内部联接。试试这个

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条件。