将select count添加到vaadin数据源

时间:2014-11-04 03:55:19

标签: java mysql jpa web-applications vaadin

您好我需要执行此选择语句

   SELECT c.*, count(r.competitorid) as num_comp, num_event.num_events
from competition c left join regcomp r on c.competitionid = r.competitionid 
left join 
(
select competition.competitionid, count(e.competitionid) as num_events
from competition left join `event` e on competition.competitionid = e.competitionid
group by competition.competitionid
) as num_event on c.competitionid = num_event.competitionid
                 )    
   AS winners ON winners.competitionid = c.competitionid;

我的问题是我不知道后面是什么模式,或者是否需要调用一组方法来为该表创建数据源。我可以创建一个IndexedContainer并添加容器属性,然后将其添加到Vaadin表中,这就是我正在做的 - 但问题是当我尝试保留数据时,如果我不这样做,我将无法使用JPA在开始时使用它。

JPA允许您通过执行setVisibleColumns(“parent.child”)非常方便地通过外键访问引用的表,因此理论上可以通过选择正确的条目实体来显示有关单行的任何信息。

但是,如果我想创建一个显示其中一列中的计数的表,我该怎么办,显然计数不是实体的一部分 - 但如果它不是实体的一部分,我该怎样才能使用这些优点JPA对包含avg(​​),count()等东西生成的数据的表格。

P.S。该查询检索一个表格,显示所有比赛以及该比赛中有多少参赛者和比赛。

2 个答案:

答案 0 :(得分:1)

这取决于您使用的JPA提供程序。 使用Hibernate时,您可以使用this post中提到的计算属性。

然后给出这样的注释:

@Formula("PRICE*1.155")
private float finalPrice;

甚至更复杂

@Formula("(select min(o.creation_date) from Orders o where o.customer_id = id)")
private Date firstOrderDate;

查看other post以获取有关此Hibernate功能的更多详细信息。

对于EclipseLink / Toplink我知道没有解决问题的方法

答案 1 :(得分:0)

持久性意味着您的类和数据库表之间有很强的联系,这些表是“坚硬,耐用”的。的东西。 在您的任务中,您从查询而不是表中获取数据,因此在此上下文中讨论持久性是不正确的。

您可以在表格中添加自定义列,您可以在其中添加自定义内容

或创建数据库视图并在其上创建实体(可以使用JPATools自动生成),如果你想拥有JPAContainer的全部功能。

干杯。