小编lel*_*rir的帖子

带有JPA Criteria API的select子句中的子查询

我正在尝试在标题中插入一个子查询,就像在这个简单的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子句中

我怎样才能得到类似的结果?

select jpa criteria subquery

15
推荐指数
2
解决办法
3万
查看次数

Logback MDC put()可变对象

我正在使用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的来源吗?

java logback slf4j mdc vaadin

6
推荐指数
1
解决办法
957
查看次数

标签 统计

criteria ×1

java ×1

jpa ×1

logback ×1

mdc ×1

select ×1

slf4j ×1

subquery ×1

vaadin ×1