繁体   English   中英

JPA查询:枚举列表IN枚举列表

[英]JPA Query: List of enums IN list of enums

我有一个搜索条件对象,其中包含枚举列表。

搜索结果还包含一个枚举列表。

我希望能够找到包含搜索条件中列出的所有枚举的搜索结果。

我尝试了以下方法,但得到了

IllegalArugmentException参数值[ENUM_VALUE_X]与预期的类型java.util.Collection不匹配(n / a)

我觉得我在某个地方犯了一个愚蠢的错误,但无法弄清楚它是什么。 我究竟做错了什么?

String queryStr = "select distinct result from SearchResult result where 
result.enumsList IN :enumsList"
...
Query query = entityManager.createQuery(queryStr, SearchResult.class);
query.setParameter("enumsList", criteria.getEnumsList());
//criteria.getEnumsList() = [ENUM_VALUE_X, ENUM_VALUE_Y]

这是解决这个问题的一种非常丑陋的方法(尽管它可以100%工作):

List<SomeEnum> enumList = criteria.getEnumsList();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < enumList.size(); i++) {
    if (i == 0) {
        sb.append("WHERE :e").append(i).append(" MEMBER OF result.enumsList");
    } else {
        sb.append(" AND ").append(":e").append(i).append(" MEMBER OF result.enumsList");
    }
}
Query query = em.createQuery("SELECT DISTINCT result FROM SearchResult result "+ sb.toString(), SearchResult.class);
for (int i = 0; i < enumList.size(); i++) {
    query.setParameter("e" + i, enumList.get(i));
}
List<SearchResult> resultList = query.getResultList();

这是zyexal的建议,尽管它与一个匹配项匹配并检查列表的长度,但它也可以工作。 因此,分隔符可能是例外的:

Query query = em.createQuery("SELECT DISTINCT result FROM SearchResult result JOIN result.enumsList e WHERE e IN :enums GROUP BY result HAVING COUNT(distinct e) = :enumsSize", SearchResult.class);
query.setParameter("enums", criteria.getEnumsList());
query.setParameter("enumsSize", criteria.getEnumsList().size());
List<SearchResult> resultList = query.getResultList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM