多条件的组合查询在程序编写逻辑上是排列组合完成的么?

2022-07-09 20:20:45 +08:00
 youthfire
比如一组数据由件号,描述,型号,供应商等多元素组成,可以单一通过件号查询,也可以通过件号+型号查询,甚至可以描述+型号+供应商查询。在设计逻辑上,是通过排列组合考虑所有可能性吗?

随着可能会查询用到的元素数量增多,除了写得又臭又长,又觉得特别容易错漏

业余爱好开发者,抱歉
1240 次点击
所在节点    程序员
7 条回复
dunkelheit
2022-07-09 20:42:00 +08:00
找个 orm 框架,查询还是挺容易的吧?

@repo.get_by(Item, %{
id: ^id,
desc: ^desc,
vendor: ^vendor
})
akira
2022-07-09 22:03:36 +08:00
多条件的组合查询要么都是 或 ,要么都是 与, 看需要,直接列出来就好了
meeop
2022-07-09 22:50:06 +08:00
代码上:
if(件号!=null)
sql+=“ 件号=xxx ”


if(型号!=null)
sql+=“ 型号=xxx ”

所有排列组合都可以啊

数据库索引上是得排列组合的,所以还是要约束需求,别什么查询都支持
dcsuibian
2022-07-09 23:01:59 +08:00
引用知乎的:
db 访问分为这么几种
1. 写 sql ,各个 db 差异要自己适配
2. 写 dsl ,屏蔽了 db 差异,自动适配
3. 运行时或编译时自动合成 sql ,屏蔽 db 差异

我是第 3 种动态生成 sql 的,用的是 JPA 的 Specification ,代码大概是这个样子:
Specification<RecordPO> spec = (root, query, cb) -> {
Path<String> termPath = root.get("term");
Path<Long> beginTimePath = root.get("beginTime");
Path<Long> endTimePath = root.get("endTime");
Predicate predicate = cb.equal(cb.literal(1), 1);
if (null != qo.getTerm()) {
predicate = cb.and(predicate, cb.equal(termPath, qo.getTerm()));
}
if (null != qo.getBeginTimeGreaterThanEqual()) {
predicate = cb.and(predicate, cb.greaterThanOrEqualTo(beginTimePath, qo.getBeginTimeGreaterThanEqual()));
}
if (null != qo.getEndTimeLessThanEqual()) {
predicate = cb.and(predicate, cb.lessThanOrEqualTo(endTimePath, qo.getEndTimeLessThanEqual()));
}
query.orderBy(cb.asc(root.get("endTime")));
return predicate;
};
return spec;
youthfire
2022-07-09 23:05:47 +08:00
先谢谢各位回答者!你们回复的不少内容一时未能消化。我上传了一张图来具体表达,如果之前文字没有表述足够清晰的话。
CEBBCAT
2022-07-09 23:20:22 +08:00
youthfire
2022-07-09 23:30:14 +08:00
@CEBBCAT #6 谢谢,也瞬间明白了 3 楼要表达的!感觉完全是两种思维模式

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/865159

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX