Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.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
Java JPA/JPQL查询where子句中的字符串列表标识_Java_Jakarta Ee_Jpa_Eclipselink_Jpql - Fatal编程技术网

Java JPA/JPQL查询where子句中的字符串列表标识

Java JPA/JPQL查询where子句中的字符串列表标识,java,jakarta-ee,jpa,eclipselink,jpql,Java,Jakarta Ee,Jpa,Eclipselink,Jpql,假设我有一个@Entity,比如 当我尝试使用getResultList执行查询时,此操作失败。错误为java.sql.SQLSyntaxErrorException:行-列计数不匹配 我还尝试了join: 但这也失败了,因为集合值路径“c.sequence”必须解析为关联字段。我对这一点的解释是,join不处理原语集合,而只处理关系 因此,我的问题是: 正确的方法是什么 还有,有没有一种方法可以对原始集合执行更复杂的操作,如查询集合的交点、并集或差异?在研究了internet和JPA规范后,我

假设我有一个@Entity,比如

当我尝试使用getResultList执行查询时,此操作失败。错误为java.sql.SQLSyntaxErrorException:行-列计数不匹配

我还尝试了join:

但这也失败了,因为集合值路径“c.sequence”必须解析为关联字段。我对这一点的解释是,join不处理原语集合,而只处理关系

因此,我的问题是:

正确的方法是什么


还有,有没有一种方法可以对原始集合执行更复杂的操作,如查询集合的交点、并集或差异?

在研究了internet和JPA规范后,我发现我们无法使用JPQL比较两个列表


我建议选择整个列表,然后使用ApacheCommons将其与第二个列表进行比较。它提供和的功能。

我找不到任何可以使用JPQL直接比较列表的解决方案或文章。但有一种机制可以测试值是否是集合的成员

这个过程并不优雅,但经过一些调整,我们可以构建一个类似于此的查询。我们无法测试代码,但我认为它描述了这个想法和 从逻辑上讲,它应该起作用:

String query = "SELECT c FROM C c";
String checkValue = "";

for(int i = 0; i<queryString.size();i++){

    checkValue = queryString.get(i);

    if(i==queryString.size()-1){
        query += " WHERE '" + checkValue + "'" + " MEMBER OF c.sequence";
    }else{
        query += " WHERE '" + checkValue + "'" + " MEMBER OF c.sequence AND";
    }
}

DB?@ PopeDePATI中的实体是如何不必考虑这个问题的主要论点之一使用ORM?em.createQuery无法显式映射到实体。你是说createNativeQuery吗?如果这意味着,那么您的查询应该如下所示:selectsequencefromc,其中C.sequence=:qs。另外,您不应该使用列表序列,因为您得到的结果是一个实体列表。@pmp抱歉,我不理解您的评论。我将em.createQuery与class参数一起使用,这将创建一个TypedQuery,从中我可以接收一个类型化的结果列表。我想要c.sequence与给定序列匹配的Cs列表,即list。您使用的是JPA JPQL还是Hibernate?选择整个列表是什么意思?从数据库中检索所有实体正是我想要避免使用查询的地方。我非常确定的是,数据库中的每个成员也是一个子查询。不幸的是,这是一种n+1方法
List<String> querySeq = ... // some list to be used in the where clause
em.createQuery("select c from C c where c.sequence = :qs", C.class)
            .setParameter("qs", querySeq);
select c from C c join c.sequence s where s in :qs
String query = "SELECT c FROM C c";
String checkValue = "";

for(int i = 0; i<queryString.size();i++){

    checkValue = queryString.get(i);

    if(i==queryString.size()-1){
        query += " WHERE '" + checkValue + "'" + " MEMBER OF c.sequence";
    }else{
        query += " WHERE '" + checkValue + "'" + " MEMBER OF c.sequence AND";
    }
}