我正在尝试在标题中插入一个子查询,就像在这个简单的SQL中一样:
SELECT id, name, (select count(*) from item) from item
Run Code Online (Sandbox Code Playgroud)
这显然只是一个模拟查询只是为了说明我的观点.(关键是获取查询返回的每个项目的最后一张发票.)
我试过这个:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Tuple> c = cb.createTupleQuery();
Root<Item> item= c.from(Item.class);
Subquery<Long> scount = c.subquery(Long.class);
Root<Item> sarticolo = scount.from(Item.class);
scount.select(cb.count(sitem));
c.multiselect(item.get("id"),item.get("nome"), scount);
Query q = em.createQuery(c);
q.setMaxResults(100);
List<Tuple> result = q.getResultList();
for(Tuple t: result){
System.out.println(t.get(0) + ", " + t.get(1) + ", " + t.get(2));
}
Run Code Online (Sandbox Code Playgroud)
但我只得到:
java.lang.IllegalStateException:子查询不能出现在select子句中
我怎样才能得到类似的结果?
我正在使用Vaadin框架,它对截取事件的支持很少,我不知道会话或UI何时被激活,所以我不能将它们的ID放在MDC中.
通常我会:
public void onSessionBegin(){
MDC.put("session", VaadinSession.getCurrent().toString()); //<-- String is immutable
}
public void onSessionEnd(){
MDC.remove("session");
}
Run Code Online (Sandbox Code Playgroud)
但我没有这样的事件,所以我想:
// in the servlet init or wherever
MDC.put("session", new Object(){
public String toString() {
VaadinSession.getCurrent().toString()
};
}); //<-- This is mutable and will be evaluated each time
Run Code Online (Sandbox Code Playgroud)
这样,无论多少时间都会改变会话,在日志中我会得到当前的一个.
这可能吗?如何使用自定义MDC实现替换logback MDC实现?我应该编辑slf4j和logback的来源吗?