【问题标题】:JPA 2.0 Query for Collection Map to compare to List StringJPA 2.0 查询集合映射以与列表字符串进行比较
【发布时间】:2017-01-01 20:37:16
【问题描述】:

我正在尝试从联合集合中获取 Map 值以与列表字符串进行比较。我不断收到异常。

这是我的查询,

 public long countByTypeAndPropertyKeyWithValue(List<String> type, String key, List<String> value, Date fromTime, Date toTime) {
    EntityManager em = entityManagerFactory.createEntityManager();
    Query query = em.createQuery("select count(o) from EbizEvent o JOIN o.properties p where o.type in :type and KEY(p)=:name and VALUE(p)= :val and o.timestamp between :fromTime and :toTime");
    query.setParameter("type", type);
    query.setParameter("name", key);
    query.setParameter("val", value);
    query.setParameter("fromTime", fromTime);
    query.setParameter("toTime", toTime);
    long count = (Long) query.getSingleResult();
    return count;
}

EbizEvent 表有一个属性表,该表是联合的,

@ElementCollection( fetch = FetchType.EAGER)
@MapKeyColumn(name="KEY")
@Column(name="VALUE")
@CollectionTable(name="EBIZ_EVENT_PROPERTY", joinColumns=@JoinColumn(name="EVENT_ID"))
Map<String, String> properties = new HashMap<String, String>();

问题是,查询在值区域不断出现异常,

如果我的 val 只是一个字符串,则此方法有效。如果我使用列表,它会出错。

VALUE(p)= :val

在“select count(o) from EbizEvent o JOIN o.properties p where o.type in :type and KEY(p)=:name and VALUE(p)= 中声明的参数“Parameter('val')”: :fromTime 和 :toTime 之间的 val 和 o.timestamp 设置为“java.util.ArrayList”类型的“[SGP]”值,但此参数绑定到“java.lang.String”类型的字段。


我也尝试过使用在非属性表上工作的 IN,但仍然抛出异常。

VALUE(p) IN :val

“在第 97 个字符处遇到“VALUE (p) IN”,但应为:[“(”、“)”、“*”、“+”、“-”、“.”、“/”、“: "、""、"="、">"、">="、"?"、"ABS"、"ALL"、"AND"、"ANY"、" AS”、“ASC”、“AVG”、“BETWEEN”、“BOTH”、“BY”、“CASE”、“COALESCE”、“CONCAT”、“COUNT”、“CURRENT_DATE”、“CURRENT_TIME”、“CURRENT_TIMESTAMP” 、“删除”、“DESC”、“DISTINCT”、“ELSE”、“EMPTY”、“END”、“ESCAPE”、“EXISTS”、“FETCH”、“FROM”、“GROUP”、“HAVING”、“ IN”、“INDEX”、“INNER”、“IS”、“JOIN”、“KEY”、“LEADING”、“LEFT”、“LENGTH”、“LIKE”、“LOCATE”、“LOWER”、“MAX” ,“成员”,“最小”,“MOD”,“新”,“NOT”,“NULL”,“NULLIF”,“OBJECT”,“OF”,“OR”,“ORDER”,“OUTER”,“ SELECT”、“SET”、“SIZE”、“SOME”、“SQRT”、“SUBSTRING”、“SUM”、“THEN”、“TRAILING”、“TRIM”、“TYPE”、“UPDATE”、“UPPER” , "值", "时间", "哪里", , , , , , , , , ]."在解析 JPQL 时“从 EbizEvent o JOIN o.properties p 中选择 count(o),其中 o.type in :type and KEY(p)=:name and VALUE(p) in :val and o.timestamp between :fromTime 和 :toTime ”。请参阅嵌套堆栈跟踪以了解原始解析错误。

我也试过:val member of VALUE(p), 这引发了与上面相同的错误。


在网上寻找任何 JPA 被证明是一项艰巨的任务。我找不到任何在同一条船上的东西。

【问题讨论】:

    标签: java jpa-2.0


    【解决方案1】:

    检查您的查询,我认为这是错误的,您使用的是没有 ON 的 JOIN。

    【讨论】:

    • 就像我说的,如果 val 不是列表字符串而只是一个字符串,它就可以工作。那么,这如何使 JOIN 的查询出错呢? stackoverflow.com/questions/3730625/jpa-join-in-jpql
    • 标记你答案的不是我。虽然我不怪他们。答案应该经过一定程度的测试或有研究支持。至于负面评价,也许可以请一个模组来帮助你。
    • 好的,很抱歉让您失望了。如果您的问题是当您发送列表时,可能列表中的某些数据正在转义查询。
    猜你喜欢
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 2020-05-14
    • 2017-12-03
    • 1970-01-01
    相关资源
    最近更新 更多