作者csieflyman (风之骄子)
看板java
标题Re: [问题] mvc里service的用途
时间Mon May 29 17:50:37 2017
请问大家是怎麽实作 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://webptt.com/cn.aspx?n=bbs/java/M.1496051440.A.159.html
1F:→ ssccg: 我觉得这样就够了,service层不应该知道太多资料细节(join 05/29 19:03
2F:→ ssccg: 、复杂的条件组合),真的需要就直接开别的方法比较清楚 05/29 19:04
3F:推 gmoz: 有点像JPA的 NamedQuery? 05/29 21:39
4F:推 olen0622: 在DAO层利用条件判断组出查询字串? 06/01 17:54
5F:→ csieflyman: JPA 有 metadata api 可以取得某个物件属性的type 还 06/01 19:16
6F:→ csieflyman: 有是否为association 。如此就可以知道遇到associatio 06/01 19:16
7F:→ csieflyman: n 属性要 join , setParameter 要将字串值转成什麽 06/01 19:16
8F:→ csieflyman: 型态 06/01 19:16
9F:→ csieflyman: 涉及两张资料表以内的任何条件SQL都能自动产生出来 06/01 19:38
10F:推 swpoker: 不可能,因查询sql会很因客制复杂,很难模组化,我做法是 06/02 10:34
11F:→ swpoker: 将SQL本身模组化,在dao层共用 06/02 10:34