Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.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 使用动态列表使用JPA2.0构建条件查询_Java_Dynamic_Jpa 2.0_Criteria Api_Criteriaquery - Fatal编程技术网

Java 使用动态列表使用JPA2.0构建条件查询

Java 使用动态列表使用JPA2.0构建条件查询,java,dynamic,jpa-2.0,criteria-api,criteriaquery,Java,Dynamic,Jpa 2.0,Criteria Api,Criteriaquery,在使用JPA2.0创建criteriaQuery时,我有点困惑 先决条件: 我有一个Gui,用户可以在其中用一些选项(比如温度/风/时间段等)标记一些wheatherstations复选框 现在,我想设置一个criteriaQuery,从sql数据库中选择所选的项,并将其作为对象/映射/列表返回,以构建一些数据模型(这将用于生成一些primefaces图表) 到目前为止我拥有的: // for presentation purposes just this mockup-data Calenda

在使用JPA2.0创建criteriaQuery时,我有点困惑

先决条件:
我有一个Gui,用户可以在其中用一些选项(比如温度/风/时间段等)标记一些wheatherstations复选框

现在,我想设置一个criteriaQuery,从sql数据库中选择所选的项,并将其作为对象/映射/列表返回,以构建一些数据模型(这将用于生成一些primefaces图表)

到目前为止我拥有的:

// for presentation purposes just this mockup-data
Calendar start = new GregorianCalendar(2011, Calendar.APRIL, 1);
Calendar end = new GregorianCalendar(2011, Calendar.MAY, 1);
List<String> selectedStations = new LinkedList<String>() {{
    add("PS1");
    add("PS2");
    add("PS3");
}};
Map<String, Object selectedOptions = new LinkedHashMap<String, Object>() {{
    put("opt1","val1");
    put("opt2","val2");
    put("opt3","val3");
}};
List<String> sel = new LinkedList<String>() {{
    add("selOpt1");
    add("selOpt2");
    add("selOpt3");
}};
//出于演示目的,仅此模型数据
日历开始=新的格里高利安日历(2011年4月1日);
日历结束=新的格里高利安日历(2011年5月1日);
列出所选站点=新建链接列表(){{
添加(“PS1”);
添加(“PS2”);
添加(“PS3”);
}};

映射好吧,有时候它太琐碎而不真实--

用我的动态列表填充cq.multiselect()的一种方法是创建一个选择列表,并将其传递给我的multiselect查询

List<Selection<?>> s = new LinkedList<Selection<?>>();

for (String item : sel) {
    s.add(r.get(item));
}

cq.multiselect(s);
List>();
用于(字符串项:sel){
s、 添加(r.get(item));
}
cq.多选;
很容易,但可能有人也有同样的困难:)

即使没有,也可以将其视为criteriaQuery的示例;)cq.multiselect()
的主要问题仍然存在:(好吧,我没有意识到……乍一看,这似乎是主要问题。你能以一种有助于他人的方式回答你自己的问题吗?如果你能回答,你可以选择你自己的答案作为正确答案。这可能看起来很奇怪,但这是处理类似情况的首选方式。哇,我发现这一点真是太神奇了……谢谢,是他一杯。
// ... where (name="PS1" or name="PS2" or name="PS3") ...
Predicate p1 = cb.disjunction();
for (String s : selectedStations) {
    p1 = cb.or(p1, cb.equal(r.get("name").as(String.class), s));
}
Predicate p2 = cb.between(r.get("fetchDate").as(Date.class),
    start.getTime(), end.getTime());
Predicate p3 = cb.conjunction();
for (Map.Entry<String, Object> param : selectedOptions.entrySet())
    p3 = cb.and(p3, cb.equal(r.get(param.getKey()), param.getValue()));
// This is working but static :(
cq.multiselect(r.get(sel.get(0)), r.get(sel.get(1)), r.get(sel.get(2)));

// i would prefer to have something like 
for (int i=0;i<sel.size();i++) {
    cq.multiselect().add(r.get(sel.get(i)));
}
cq.where(cb.and(p1,p2,p3));

List<Tuple> res = em.createQuery(cq).getResultList();
for (Tuple t : res) {
    // do something ...
};
return <something useful>
SELECT {items from List<String> sel}
FROM MyStationDatabase
WHERE (name = selectedStation.get(0) OR ... OR name = selectedStation.get(last))
    AND {items from Map<String,Object> selectedOptions}
List<Selection<?>> s = new LinkedList<Selection<?>>();

for (String item : sel) {
    s.add(r.get(item));
}

cq.multiselect(s);