2014-11-04 58 views
0

您好我有,我需要做的select語句將選擇計數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在開始時使用它。

JPA允許您通過setVisibleColumns(「parent.child」)非常方便地通過外鍵訪問引用表,因此理論上可以通過選擇正確的入口實體來顯示關於單個行的任何信息。

但是我該怎麼做,如果我想創建一個表,顯示在其中一列的計數,顯然計數不是實體的一部分 - 但如果它不是實體的一部分,我怎麼能使用JPA在包含由avg(),count()等東西生成的數據的表上的好處。

PS該查詢檢索顯示所有比賽以及該競賽中有多少競爭者和事件的表格。

回答

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對這個休眠功能的更多細節。

對於的EclipseLink/Toplink的我知道,沒有解決問題的辦法

+0

我使用hibernate,謝謝這是一個很好的開始 – 2014-11-04 20:07:12

0

持久性意味着你有你的類和數據庫表,這是「硬,耐用」的事物之間強有力的紐帶。 在你的queston中,你從查詢中獲取數據,而不是表格,所以在這種情況下討論持久性是不正確的。

你可以做的就是在你的表添加自定義的列,其中您自定義的東西,

或使數據庫視圖,並創建一個實體,它(可以用JPATools自動生成),如果你想擁有JPAContainer的全部功能。

乾杯。