public void SearchUser(
string userName,
int? age
) {
// 以 NHibernate 的动态查询示例
ISession session = OpenSession();
IQueryable<User> query = session.Query<User>();
// 根据参数动态构建表达式树
if (userName.IsNotNullOrEmpty()) {
query = query.Where(user => user.UserName.Contains(userName) )
}
if (age.HasValue) {
query = query.Where(user => user.Age >= age);
}
// 可以先根据构造好的表达式树进行 Count 查询
long userCount = query.LongCount();
// 也可以继续添加其它表达式,并查询结果
IList<User> users = query.OrderBy(user => user.Id)
.Select(user => new User { Id = user.Id, UserName = user.UserName })
.ToList();
}
Last active
December 3, 2020 09:38
-
-
Save beginor/4bc9bfd25dfd9f488156cf4975b707f6 to your computer and use it in GitHub Desktop.
dynamic query demo
如果是用 java 版本的 hibernate 的话, 也能实现上面的功能, 不过确实要写的代码会啰嗦一些, 你提供的这种写法会更加简洁。
其实我的项目主要解决两个问题:
1)自动生成代码,主要是简单的单表查询和关联对象查询
2)Java 的表达式能直接转换为SQL 的表达式(这块目前没有人实现)
- 自动生成代码,很多工具都带了, 自己写一个也不难, 不过建议把自动生成代码的工具集成到编译系统里(gradle/maven), 而不是集成到 ide 里面, 比如 hibernate 自带的生成工具就可以集成到 gradle
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter:5.7.0'
implementation 'com.google.guava:guava:29.0-jre'
implementation 'org.postgresql:postgresql:42.2.18'
implementation 'org.hibernate:hibernate-core:5.4.24.Final'
implementation 'javax.xml.bind:jaxb-api:2.3.1'
runtimeOnly 'org.glassfish.jaxb:jaxb-runtime:2.3.1'
// hibernate 代码生成工具
annotationProcessor('org.hibernate:hibernate-jpamodelgen:5.4.24.Final')
}
- 希望你能干翻 JOOQ , 貌似已经挺久的啦, 但是目前还看不出来你的项目相比 jooq 有什么压倒性的优势;
1)他们那些都是静态代码生成的,每次改动模型后,都需要重新编译后,才能正常使用,而我是动态生成的,结合 IntelliJ IDEA 插件自动实现,相比他们已经方便很多多了,尤其是开发早期,模型经常变。
2)我参考了JOOQ 挺多东西,你看他的Demo 里没有复杂表达式计算,因为那块处理起来特别复杂,而在实际使用时,各种数学计算是很多的,现有的所有框架都是通过函数来封装表达式计算的,plus(), minus(), multip(),如果表达式复杂,这样的函数套在一起根本看不清的。
我已经参考了流行的所有ORM 框架了,也读了他们的代码,就靠这两点,使开发效率提升了很多,后期将项目稳定后,一定能超越这些框架
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
我改进了一下,这样会更友好一点: