V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Braisdom  ›  全部回复第 26 页 / 共 31 页
回复总数  607
1 ... 18  19  20  21  22  23  24  25  26  27 ... 31  
2020-12-04 18:08:15 +08:00
回复了 Braisdom 创建的主题 程序员 Java 运算符重载(Operator Overloading)原理
@aguesuka 是的,所以我采用的是比较迂回的方法,先解析表达式,然后在编译期覆盖代码实现的

期待 JDK 后续变化,我提个 issue 给 JDK
2020-12-04 17:33:29 +08:00
回复了 Braisdom 创建的主题 程序员 Java 运算符重载(Operator Overloading)原理
@cpstar 这是 OO 里最传统的想法,不能为了 OO 而去 OO,过于理论化的思考,而不考虑实际。

一个同环比的计算是最常见的:(sum(current) - sum(last)) / sum(last) * 100
这样的表达式用函数做就太复杂了
2020-12-04 17:29:48 +08:00
回复了 Braisdom 创建的主题 程序员 Java 运算符重载(Operator Overloading)原理
@ximigou007 我觉得是个人偏好的问题,只是 Java 的创始人不喜欢运算符重载,但它想的不够远
2020-12-04 15:00:22 +08:00
回复了 Braisdom 创建的主题 程序员 Java 运算符重载(Operator Overloading)原理
@Vedar 同意,我很敬佩 C++ 的设计者,他们能解决我们“不知道我们不知道的事情”
2020-12-04 14:59:26 +08:00
回复了 Braisdom 创建的主题 程序员 Java 运算符重载(Operator Overloading)原理
@no1xsyzy 不同的思考维度,肯定不是某一个,或某一些原因。

我们生活的世界有两个,一个是真实运行的世界,还有一个是脑子里的世界(也就是“应该”的世界),但两都往往偏差很大
2020-12-04 14:57:15 +08:00
回复了 Braisdom 创建的主题 程序员 Java 运算符重载(Operator Overloading)原理
@no1xsyzy 我相信 Java 后面必定会支持运算符重载,虽然现在没有真实的项目在用,我是第一个,国外有几篇论文在讨论。

DSL 是一个很泛的概念,SQL 是一个 DSL,基于 Java 的 API 封装的 SQL 不一定属于 DSL 的范畴,因为它是一个高度抽象的语言,存在的只是一堆 Interface,基于 Interface 可以实现很多特性
2020-12-04 14:54:17 +08:00
回复了 Braisdom 创建的主题 程序员 Java 运算符重载(Operator Overloading)原理
@no1xsyzy 小细节...
2020-12-04 14:52:12 +08:00
回复了 Braisdom 创建的主题 程序员 Java 运算符重载(Operator Overloading)原理
@no1xsyzy Smalltalk 是面向对象的鼻祖,很多概念都被借鉴了,为什么不能发展起来,也是有它内在的原因
2020-12-04 14:50:45 +08:00
回复了 Braisdom 创建的主题 程序员 Java 运算符重载(Operator Overloading)原理
@xzenge 有时候由不得你去选择,解决 Java 的运算符重载,也是被迫的
2020-12-04 14:49:50 +08:00
回复了 Braisdom 创建的主题 程序员 Java 运算符重载(Operator Overloading)原理
@lewis89 一个语言要能跟随的时代的发展,C++ 的设计就是为了解决“我们不知道的不知道的东西”,很伟大。
2020-12-04 14:48:29 +08:00
回复了 Braisdom 创建的主题 程序员 Java 运算符重载(Operator Overloading)原理
@PVG 认可你的想法,的确可以想干什么就干什么
2020-12-04 14:08:20 +08:00
回复了 Braisdom 创建的主题 程序员 Java 运算符重载(Operator Overloading)原理
没有运算符重载者是恶梦的开始
2020-12-04 13:51:29 +08:00
回复了 Braisdom 创建的主题 程序员 Java 运算符重载(Operator Overloading)原理
有兴趣的,可以交流
2020-12-01 15:00:12 +08:00
回复了 Braisdom 创建的主题 程序员 ObjectiveSQL 稳定版本发布 1.4.0
@zhangysh1995 [email protected]
ORM 性能问题不是慢 SQL,而是在大规模写和读时的性能,这块我还在优化,和 MyBatis 的性能差不多,但离 JDBC 原始 SQL 还是有差距。
2020-12-01 10:10:01 +08:00
回复了 Braisdom 创建的主题 程序员 ObjectiveSQL 稳定版本发布 1.4.0
我也在 gist 里回复了。

public List<User> searchUser(String name, Integer age) {
User.Table user = User.asTable();
Select select = new Select();
LogicalExpression predicate = new PolynaryExpression(EQ, $("1"), $("1"));

if(StringUtils.isNotBland(name)) {
predicate.and(user.name.eq(name));
}

if(age > 0) {
predicate.and(user.age.eq(age));
}

return select.orderBy(user.id.asc()).execute(User.class);
}
2020-12-01 07:54:54 +08:00
回复了 Braisdom 创建的主题 程序员 ObjectiveSQL 稳定版本发布 1.4.0
@beginor 所谓动态查询也就是根据不同的参数,join 不同的表,或者选择不同的条件,因为参与拼接的对象都是变量,本身就是动态的。
2020-11-30 22:29:51 +08:00
回复了 Braisdom 创建的主题 程序员 ObjectiveSQL 稳定版本发布 1.4.0
@beginor 给你一段项目的代码(计算一个商品销售的同环比),比较复杂:

你也可以把 SpringBoot 项目运行起来看效果:

https://github.com/braisdom/ObjectiveSql/blob/master/examples/springboot-sample/src/main/java/com/github/braisdom/objsql/sample/model/Product.java#L45


DateTime begin = DateTime.parse(rawBegin + " 00:00:00", DATE_TIME_FORMATTER);
DateTime end = DateTime.parse(rawEnd + " 23:59:59", DATE_TIME_FORMATTER);

// Creating dataset of target, last period and same period last year
Select target = createPeriodSales(rawBegin, rawEnd);
Select lp = createPeriodSales(minusMonths(begin, 1), minusMonths(end, 1));
Select sply = createPeriodSales(minusYears(begin, 1), minusYears(end, 1));

Select select = new Select();
select.from(target)
.leftOuterJoin(lp, createLPJoinCondition(target, lp))
.leftOuterJoin(sply, createSPLYJoinCondition(target, sply));

// Create calculation expression of last period
Expression lpAmount = createLPExpr(target, lp, "total_amount");
Expression lpOrderCount = createLPExpr(target, lp, "order_count");
Expression lpQuantity = createLPExpr(target, lp, "total_quantity");

// Create calculation expression of same period last year
Expression splyAmount = createSPLYExpr(target, sply, "total_amount");
Expression splyOrderCount = createSPLYExpr(target, sply, "order_count");
Expression splyQuantity = createSPLYExpr(target, sply, "total_quantity");

select.project(target.col("barcode"))
.project(target.col("sales_year"))
.project(target.col("sales_month"))
.project(formatMoney(lpAmount).as("amount_lp"))
.project(formatMoney(lpOrderCount).as("order_count_lp"))
.project(formatMoney(lpQuantity).as("quantity_lp"))
.project(formatMoney(splyAmount).as("amount_sply"))
.project(formatMoney(splyOrderCount).as("order_count_sply"))
.project(formatMoney(splyQuantity).as("quantity_sply"));

select.groupBy(target.col("barcode"),
target.col("sales_year"),
target.col("sales_month"));

return select.execute(Product.class);
2020-11-30 21:41:41 +08:00
回复了 Braisdom 创建的主题 程序员 ObjectiveSQL 稳定版本发布 1.4.0
@beginor

Order.Table orderTable = Order.asTable();
Select select = new Select();

select.project(sum(orderTable.amount) / sum(orderTable.quantity) * 100)
.from(orderTable)
.where(orderTable.quantity > 30 &&
orderTable.salesAt.between($("2020-10-10 00:00:00"), $("2020-10-30 23:59:59")))
.groupBy(orderTable.productId);

你可以看一下上述代码在 Jooq 中如果实现
2020-11-30 21:37:34 +08:00
回复了 Braisdom 创建的主题 程序员 ObjectiveSQL 稳定版本发布 1.4.0
JOOQ 称为动态查询,在 ObjectiveSQL 里称为复杂查询,详细请查询:2 复杂 SQL 查询
2020-11-30 15:31:34 +08:00
回复了 Braisdom 创建的主题 程序员 ObjectiveSQL 稳定版本发布 1.4.0
@renyijiu OK,之前是理解有对,这个问题我之前遇到过,ObjectiveSQL 已经兼容了,

之前我的一个项目是通过 ProtoBuffer 定义的模型,传输的数据极大,但需要直接存储进数据,如果中间再经过一层转换,性能太差,所以我就在 ObjectiveSQL 中设计了 DomainModelDescriptor,用于描述存储数据类型相关的信息,可以直接通过 ObjectiveSQL 进行数据库操作。

具体你可以参考: https://github.com/braisdom/ObjectiveSql/blob/master/core/src/main/java/com/github/braisdom/objsql/DomainModelDescriptor.java
1 ... 18  19  20  21  22  23  24  25  26  27 ... 31  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2774 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 19ms · UTC 11:40 · PVG 19:40 · LAX 03:40 · JFK 06:40
Developed with CodeLauncher
♥ Do have faith in what you're doing.