我想知道是否有任何库可用于将 SQL 查询表示为 Java 中的对象。
在代码中,我有大量 java.lang.String 类型的静态变量,它们是手写 SQL 查询。我会寻找具有良好流畅API 的库,它允许我将查询表示为对象而不是字符串。
例子:
Query q = select("DATE", "QUOTE")
.from("STOCKMARKET")
.where(eq("CORP", "?"))
.orderBy("DATE", DESC);
Querydsl支持查询 SQL、JPA 和 JDO 后端。
上面的例子变成:
query.from(stockmarket).where(stockmarket.corp.eq(someVar))
.orderBy(stockmarket.date.desc())
.list(stockmarket.date, stockmarket.quote);
Querydsl 通过 APT 使用代码生成将 SQL 模式镜像到 Java 查询类型。这样查询是完全类型安全的(或与 SQL 的“模式兼容”)。
我是Querydsl的维护者,所以这个答案是有偏见的。
我在这里发布了 Querydsl 与其他框架的比较。
这些是一些很好的专有库,可以动态创建类型安全的 SQL 查询
除了以上,总有
您在 jOOQ 中的示例:
create.select(DATE, QUOTE)
.from(STOCKMARKET)
.where(CORP.equal(123))
.orderBy(DATE.desc());
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();
}
Jequel 看起来很漂亮: 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)));
它还支持对带有参数的 DataSource 执行查询,因此它也可以处理参数化查询的创建。
Apache Empire-db是一个关系数据库抽象层和数据持久性组件,与传统的对象关系映射框架 (ORM) 相比,它允许开发人员在应用程序开发中采用更加以 SQL 为中心的方法。
更多信息: https ://empire-db.apache.org/
夸尔
如果您不想映射字符串查询,那么您必须将您的类注释为实体并将其与表绑定,然后您可以使用休眠或 java 持久性。示例将太复杂。但是,最后你的查询会变成这样:
查找实体列表:
Criteria c = createCreteria(entityManager, StockMarket.class);
// you can add "where" clause by using c.add(Restrictions);
// like this: c.add(Restrictions.ilike("name", "%somename%"); where "name" is your entity's field
List<StockMarket> smList = c.list();
通过 id 查找对象:
StockMarket sm = entityManager.find(StockMarket.class, id);
您可以使用 naskarlab/fluent-query:
https://github.com/naskarlab/fluent-query
例子:
@Test
public void testSelect() {
String expected = "select e0.* from Customer e0";
String actual = new QueryBuilder()
.from(Customer.class)
.to(new NativeSQL())
.sql()
;
Assert.assertEquals(expected, actual);
}
您可以在项目的单元测试中看到更多示例: