我想知道是否有任何库可用于将SQL查询表示为Java中的对象。
在代码中我有很多类型为java.lang.String的静态变量,它们是手写的SQL查询。我会寻找具有漂亮的流畅 API的库,它允许我将查询表示为对象而不是字符串。
示例:
Query q = select("DATE", "QUOTE")
.from("STOCKMARKET")
.where(eq("CORP", "?"))
.orderBy("DATE", DESC);
答案 0 :(得分:12)
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与其他框架here的比较。
答案 1 :(得分: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();
}
答案 2 :(得分:7)
它使用流畅的界面,所以它很容易阅读,几乎像自然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执行查询,因此它也处理参数化查询的创建。
答案 3 :(得分:7)
这些是一些很好的专有库,可以动态创建类型安全的SQL查询
除上述内容外,总有
你在jOOQ中的例子:
create.select(DATE, QUOTE)
.from(STOCKMARKET)
.where(CORP.equal(123))
.orderBy(DATE.desc());
答案 4 :(得分:2)
Apache Empire-db 是一个关系数据库抽象层和数据持久性组件,它允许开发人员在应用程序开发中采用比传统的对象关系映射框架(ORM)更多的以SQL为中心的方法。
更多信息: https://empire-db.apache.org/
<强> Quaere 强>
答案 5 :(得分:1)
如果您不想映射字符串查询,那么您必须将您的类注释为实体并将其与表绑定,然后您可以使用hibernate或java persistance。例子虽然太复杂了。但是,最后你的查询将变成这样的东西:
查找实体列表:
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);
答案 6 :(得分:0)
您可以使用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);
}
您可以在项目的单元测试中看到更多示例: