【发布时间】: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 被证明是一项艰巨的任务。我找不到任何在同一条船上的东西。
【问题讨论】: