加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何在没有域类的情况下在querydsl中构造查询

发布时间:2020-12-15 04:17:41 所属栏目:Java 来源:网络整理
导读:在寻找 java库以数据库无关的方式构建查询时,我遇到了许多包括iciql,querydsl,jooq,joist,hibernate等. 我想要一些不需要配置文件的东西,可以使用动态模式. 对于我的应用程序,我在运行时了解了数据库和模式,因此我不会为模式提供任何配置文件或域类. 这似乎
在寻找 java库以数据库无关的方式构建查询时,我遇到了许多包括iciql,querydsl,jooq,joist,hibernate等.

我想要一些不需要配置文件的东西,可以使用动态模式.
对于我的应用程序,我在运行时了解了数据库和模式,因此我不会为模式提供任何配置文件或域类.

这似乎是querydsl的核心目标之一,但是通过querydsl的文档我看到很多用于使用域类构建动态查询的示例但是我没有遇到任何解释如何使用仅仅构建这样的数据库不可知查询我有关于架构的动态信息.

Jooq提供了这样的功能(参见:http://www.jooq.org/doc/3.2/manual/getting-started/use-cases/jooq-as-a-standalone-sql-builder/),但是如果我想将我的重点扩展到Oracle或MS SQL(我可能不喜欢但需要支持),那么它具有限制性许可.

有querydsl经验的人能告诉我querydsl是否可以做到这一点,如果是的话,怎么做.

如果有人知道任何其他可以满足我的要求,那将非常感激.

解决方法

一个非常简单的SQL查询,例如:

@Transactional
public User findById(Long id) {
    return new SQLQuery(getConnection(),getConfiguration())
      .from(user)
      .where(user.id.eq(id))
      .singleResult(user);
}

…可以像这样动态创建(不添加任何糖):

@Transactional
public User findById(Long id) {
    Path<Object> userPath = new PathImpl<Object>(Object.class,"user");
    NumberPath<Long> idPath = Expressions.numberPath(Long.class,userPath,"id");
    StringPath usernamePath = Expressions.stringPath(userPath,"username");
    Tuple tuple = new SQLQuery(getConnection(),getConfiguration())
      .from(userPath)
      .where(idPath.eq(id))
      .singleResult(idPath,usernamePath);
    return new User(tuple.get(idPath),tuple.get(usernamePath));
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读