请问大家是怎么实作 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
请问有更好的作法吗?