是否有任何库将SQL查询表示为Java代码中的对象?

Tom*_*icz 15 java sql api fluent

我想知道是否有任何库可用于将SQL查询表示为Java中的对象.

在代码中,我有很多类型为java.lang.String的静态变量,它们是手写的SQL查询.我会寻找具有漂亮的流畅 API的库,它允许我将查询表示为对象而不是字符串.

例:

Query q = select("DATE", "QUOTE")
  .from("STOCKMARKET")
  .where(eq("CORP", "?"))
  .orderBy("DATE", DESC);
Run Code Online (Sandbox Code Playgroud)

Tim*_*per 13

Querydsl支持查询SQL,JPA和JDO后端.

上面的例子变成:

query.from(stockmarket).where(stockmarket.corp.eq(someVar))
    .orderBy(stockmarket.date.desc())
    .list(stockmarket.date, stockmarket.quote);
Run Code Online (Sandbox Code Playgroud)

Querydsl使用通过APT生成代码将SQL模式镜像到Java查询类型.这样查询完全是类型安全的(或者与SQL"符合模式").

我是Querydsl的维护者,所以这个答案是有偏见的.

在这里发布了Querydsl与其他框架的比较.


Luk*_*der 8

这些是一些很好的专有库,可以动态创建类型安全的SQL查询

除了上述之外,总会有

  • Hibernate/JPA CriteriaQuery
  • MyBatis的

你在jOOQ中的例子:

create.select(DATE, QUOTE)
      .from(STOCKMARKET)
      .where(CORP.equal(123))
      .orderBy(DATE.desc());
Run Code Online (Sandbox Code Playgroud)


Van*_*ger 7

http://www.hibernate.org/ 可能是Java最强大的ORM库.它可以做更多,然后只是简单的查询映射.因此,您可以轻松地在应用程序中的其他位置实现它.对于你的情况,它可以这样做:

public class LookupCodeName
{
    private String code;
    private String name;

 /*... getter-setters ... */
}

public class someBL {

public List<LookupCodeName> returnSomeEntity() {
      SQLQuery sqlQuery =  (SQLQuery)((HibernateSession)em).getHibernateSession()
                        .createSQLQuery( "SELECT st.name as name, st.code as code FROM someTable st")
                        .addScalar("code")
                        .addScalar("name")
.setResultTransformer(Transformers.aliasToBean(LookupCodeName.class));
    }
return (List<LookupCodeName>)sqlQuery.list();
}
Run Code Online (Sandbox Code Playgroud)


mat*_*att 7

杰克尔看起来很漂亮:http://www.jequel.de/

它使用流畅的界面,因此它很容易阅读,几乎像自然SQL(来自文档):

SqlString sql = select(ARTICLE.OID)
               .from(ARTICLE, ARTICLE_COLOR)
               .where(ARTICLE.OID.eq(ARTICLE_COLOR.ARTICLE_OID)
               .and(ARTICLE.ARTICLE_NO.is_not(NULL)));
Run Code Online (Sandbox Code Playgroud)

它还支持使用参数对DataSource执行查询,因此它也处理参数化查询的创建.