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

看板java作者 (風之驕子)時間7年前 (2017/05/29 17:50), 編輯推噓3(308)
留言11則, 5人參與, 最新討論串3/3 (看更多)
請問大家是怎麼實作 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 請問有更好的作法嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.250.199.39 ※ 文章網址: https://www.ptt.cc/bbs/java/M.1496051440.A.159.html

05/29 19:03, , 1F
我覺得這樣就夠了,service層不應該知道太多資料細節(join
05/29 19:03, 1F

05/29 19:04, , 2F
、複雜的條件組合),真的需要就直接開別的方法比較清楚
05/29 19:04, 2F

05/29 21:39, , 3F
有點像JPA的 NamedQuery?
05/29 21:39, 3F

06/01 17:54, , 4F
在DAO層利用條件判斷組出查詢字串?
06/01 17:54, 4F

06/01 19:16, , 5F
JPA 有 metadata api 可以取得某個物件屬性的type 還
06/01 19:16, 5F

06/01 19:16, , 6F
有是否為association 。如此就可以知道遇到associatio
06/01 19:16, 6F

06/01 19:16, , 7F
n 屬性要 join , setParameter 要將字串值轉成什麼
06/01 19:16, 7F

06/01 19:16, , 8F
型態
06/01 19:16, 8F

06/01 19:38, , 9F
涉及兩張資料表以內的任何條件SQL都能自動產生出來
06/01 19:38, 9F

06/02 10:34, , 10F
不可能,因查詢sql會很因客制複雜,很難模組化,我做法是
06/02 10:34, 10F

06/02 10:34, , 11F
將SQL本身模組化,在dao層共用
06/02 10:34, 11F
文章代碼(AID): #1PA-xm5P (java)
文章代碼(AID): #1PA-xm5P (java)