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