Re: [問題] mvc裡service的用途

作者: csieflyman (風之驕子)   2017-05-29 17:50:37
請問大家是怎麼實作 service 層的「查詢」?
如果是 CRUD 動作 那還蠻直覺的
id create(A)
void update(A)
A get(id)
void delete(id)
可是查詢動作就複雜許多
最常見的需求是指定多個條件(假設都是and),例如 A.x = 'foo' and A.y = 1
也可更進一步指定 orderBy、paging 條件
再進一步甚至可指定 僅回傳一部分欄位的資料、或是一併抓取某種關係的物件
例如查詢 user,想要一併回傳 user's address 資料
而這些條件通常是來自 url query string
另一個實作目標是想要支援多種DAO實作,即不限定為 RDBMS
我個人的作法是宣告為 List<A> find(QueryParam params)
將 query string 對應至自訂查詢物件 QueryParam
然後 DAO 實作再將 QueryParam 轉換為特定的查詢語法,例如 HQL
對我來說 基本上可滿足大部分的查詢需求
如果是複雜的 join 或是有 and or 夾雜的 就沒辦法了
有一個好處是可以減少 service 的方法數量,以前的作法是
findByX(String x)
findByY(int y)
或是
findByXandY(String x, int y) 但裡面就要判斷 x, y是否為 null
請問有更好的作法嗎?
作者: ssccg (23)   2017-05-29 19:03:00
我覺得這樣就夠了,service層不應該知道太多資料細節(join、複雜的條件組合),真的需要就直接開別的方法比較清楚
作者: gmoz ( This can't do that. )   2017-05-29 21:39:00
有點像JPA的 NamedQuery?
作者: olen0622 (hong)   2017-06-01 17:54:00
在DAO層利用條件判斷組出查詢字串?
作者: csieflyman (風之驕子)   2017-06-01 19:16:00
JPA 有 metadata api 可以取得某個物件屬性的type 還有是否為association 。如此就可以知道遇到association 屬性要 join , setParameter 要將字串值轉成什麼型態涉及兩張資料表以內的任何條件SQL都能自動產生出來
作者: swpoker (swpoker)   2017-06-02 10:34:00
不可能,因查詢sql會很因客制複雜,很難模組化,我做法是將SQL本身模組化,在dao層共用

Links booklink

Contact Us: admin [ a t ] ucptt.com