代码之家  ›  专栏  ›  技术社区  ›  Tomasz Blachowicz

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

  •  14
  • Tomasz Blachowicz  · 技术社区  · 16 年前

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

    在代码中,我有大量java.lang.string类型的静态变量是手工编写的SQL查询。我想找图书馆 流利的 允许我将查询表示为对象而不是字符串的API。

    例子:

    Query q = select("DATE", "QUOTE")
      .from("STOCKMARKET")
      .where(eq("CORP", "?"))
      .orderBy("DATE", DESC);
    
    7 回复  |  直到 7 年前
        1
  •  7
  •   matt    16 年前

    杰奎尔看起来很漂亮: 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)));
    

    它还支持对带有参数的数据源执行查询,因此它也处理参数化查询的创建。

        2
  •  12
  •   Timo Westkämper    14 年前

    Querydsl 支持对SQL、JPA和JDO后端的查询。

    上面的例子是:

    query.from(stockmarket).where(stockmarket.corp.eq(someVar))
        .orderBy(stockmarket.date.desc())
        .list(stockmarket.date, stockmarket.quote);
    

    QueRDSL通过APT使用代码生成来将SQL模式镜像到Java查询类型。通过这种方式,查询是完全类型安全的(或与SQL“模式兼容”)。

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

    我将QueryDSL与其他框架进行了比较 here .

        3
  •  7
  •   Vanger    16 年前

    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();
    }
    
        4
  •  7
  •   Lukas Eder    13 年前

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

    除此之外,总有

    • 休眠/JPA标准查询
    • 糠巴比妥

    您在Jooq中的示例:

    create.select(DATE, QUOTE)
          .from(STOCKMARKET)
          .where(CORP.equal(123))
          .orderBy(DATE.desc());
    
        5
  •  2
  •   Barun    9 年前

    阿帕奇帝国数据库 是一个关系数据库抽象层和数据持久性组件,允许开发人员在应用程序开发中采用比传统的对象关系映射框架(ORM)更以SQL为中心的方法。

    这里更多: https://empire-db.apache.org/

    奎尔

    http://xircles.codehaus.org/projects/quaere

        6
  •  1
  •   Vanger    16 年前

    如果不想映射字符串查询,则必须将类注解为实体并将其与表绑定,然后可以使用Hibernate或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);
    
        7
  •  0
  •   rafaelnaskar    7 年前

    您可以使用naskarlab/fluent查询:

    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);
    }
    

    您可以在项目的单元测试中看到更多示例:

    https://github.com/naskarlab/fluent-query/blob/master/src/test/java/com/naskar/fluentquery/TestNativeSimpleConventionQueryTest.java