大家帮看看这种 Java 写 sql 的代码可取吗

2020-10-27 12:10:01 +08:00
 madworks

@Override public DataListPage getDataListPageByFirstClass(DataListParams dataListParams, String firstClass, String branchStoreId) {

    String mainStoreId = BusinessUtils.getMainStoreId(branchStoreId);

    String listHql = CONSTRUCTOR
            + " FROM TCmsLesson cl, TCmsLessonStoreRel r"
            + " WHERE cl.firstClass = :firstClass"
            + " AND cl.isValid = 1"
            + " AND cl.id = r.lessonId"
            + " AND r.storeId in (:mainStoreId , :branchStoreId , '0000000')";

    String countHql = "SELECT COUNT(cl.id) FROM"
            + " TCmsLesson cl, TCmsLessonStoreRel r"
            + " WHERE cl.firstClass = :firstClass"
            + " AND cl.isValid = 1"
            + " AND cl.id = r.lessonId"
            + " AND r.storeId in (:mainStoreId , :branchStoreId , '0000000')";

    dataListParams.setDateParam("cl.createDate");

    return super.getDataListPageByHql(listHql, countHql, dataListParams, firstClass, mainStoreId, branchStoreId);
}

private List<T> listDataByHql(String hql, DataListParams dataListParams, Object... values) {
	if (StringUtils.isNotEmpty(dataListParams.getBeginTime())
			&& StringUtils.isNotEmpty(dataListParams.getEndTime())) {
		hql = hql + " AND " + dataListParams.getDateParam() + " BETWEEN '" + dataListParams.getBeginTime()
				+ "' AND '" + dataListParams.getEndTime() + "'";
	} else if (StringUtils.isNotEmpty(dataListParams.getBeginTime())) {
		hql = hql + " AND " + dataListParams.getDateParam() + " >= '" + dataListParams.getBeginTime() + "'";
	} else if (StringUtils.isNotEmpty(dataListParams.getEndTime())) {
		hql = hql + " AND " + dataListParams.getDateParam() + " <= '" + dataListParams.getEndTime() + "'";
	}

	if (StringUtils.isNotEmpty(dataListParams.getOrderBy())) {
		hql = hql + " ORDER BY " + dataListParams.getOrderBy();
	}

	if (dataListParams.isDesc()) {
		hql = hql + " DESC";
	}

	if (dataListParams.getPage() != null) {
		return this.listByPage(hql, dataListParams.getPage(), values);
	} else {
		return dataListParams.getSize() == 0
				? this.listByParamsAndPosition(hql, dataListParams.getStartPosition(), values)
				: this.listBySizeAndPosition(hql, dataListParams.getSize(), dataListParams.getStartPosition(),
						values);
	}
}
3739 次点击
所在节点    Java
35 条回复
joyhub2140
2020-10-27 14:50:34 +08:00
内部小项目这样子搞没太大问题,商业项目这样子,早晚推倒重做。
lonelymarried
2020-10-27 14:58:35 +08:00
我刚学 java,如果复杂的查询不这样写,那么怎么写呢。学习一下。
la2la
2020-10-27 15:04:10 +08:00
我们公司的项目部分接口就是这么搞得,看的脑壳疼。但是领导都没说什么,我还能做啥呢
somefree
2020-10-27 15:29:19 +08:00
这一看都是上古时期的代码了, 跟我以前的公司代码有的一拼
fatpower
2020-10-27 15:33:41 +08:00
这个不是 sql,是 hql 。
上古时期的代码都这样
weizhen199
2020-10-27 16:04:48 +08:00
你们仔细看看,我咋觉得这 sql 参数化了??
madworks
2020-10-27 16:21:12 +08:00
@weizhen199 什么叫 sql 参数化
a719031256
2020-10-27 16:21:54 +08:00
人才。。
dyeed
2020-10-27 16:22:51 +08:00
@fatpower 需要维护丝丝诶吃( SSH )的我 o(╥﹏╥)o 了。。。。。。。。。
aguesuka
2020-10-27 17:45:43 +08:00
好不好不评价,给几个建议。String hql=前一句加上 // language=HQL (sql jpaql 同理)。参数使用冒号加参数名的格式,然后用 setparammap 或者 setpropsobject 设置参数的值。参数和返回值加上泛型。
java 的 orm 包括不限于 jpa mybatis springtemplate 都不咋地,在面相对象而且自省能力这么弱的语言里发明一种代替 sql 的 dsl 是不可能的。
我能想到的最好办法是整合项目设计的时候不考虑 sql,专门招聘一个实习生来写 dao 层。
meepo3927
2020-10-27 17:59:16 +08:00
嗯…… 这个换行风格,看着好难受
akira
2020-10-27 18:07:00 +08:00
不可取。 现在应该都放弃这种写法了吧。 可维护性不是很好
jin7
2020-10-28 00:06:34 +08:00
看着麻烦
Joker123456789
2020-11-12 11:15:00 +08:00
首先,你如果问的是把 sql 写在类里面 这种方式可不可取,那我个人认为把 sql 写类里面,和写 xml 里没啥区别, 现在都是 boot 打 jar 包,即使写在 xml 里 也是无法在线上更改的。

无论写哪,只要牵扯到改,都要程序员改完提测 然后重新打包发布,所以写类和写 xml 已经没有本质区别了。

所以,这种写法我个人认为完全没问题,不过肯定会有一些 盲目遵守规范的人 会说不行, 这个就不做争论了。。

其次,如果你问的这你贴出来的这段代码有没有问题,那么其他人已经都告诉你了,你需要让代码分布的更合理一点,然后参数不要拼接,要用占位符。
ly61
2020-11-19 17:13:18 +08:00
自己写爽不爽我不知道,但是后面维护的人肯定很爽

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

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

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

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

© 2021 V2EX