Есть ли какая-либо библиотека для представления SQL-запросов в качестве объектов в Java-коде?

Мне было интересно, есть ли какая-либо библиотека, которая может использоваться для представления SQL-запросов как объектов в Java.

В коде у меня много статических переменных типа java.lang.String, которые представляют собой написанные вручную SQL-запросы. Я бы искал библиотеку, имеющую хороший fluct API, который позволяет мне представлять запросы как объекты, а не строки.

Пример:

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

Ответы

Ответ 1

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 с параметрами, поэтому он также обрабатывает создание параметризованных запросов.

Ответ 2

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 с другими фреймами здесь.

Ответ 3

http://www.hibernate.org/ Вероятно, самая мощная библиотека ORM для Java. Он может сделать гораздо больше, чем просто простое сопоставление запросов. Таким образом, вы можете легко реализовать его где-то еще в своем приложении. Для вашего дела это можно сделать так:

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

Это некоторые хорошие запатентованные библиотеки для динамического создания динамических SQL-запросов

Помимо вышеизложенного, всегда существует

  • Hibernate/JPA CriteriaQuery
  • MyBatis

Ваш пример в jOOQ:

create.select(DATE, QUOTE)
      .from(STOCKMARKET)
      .where(CORP.equal(123))
      .orderBy(DATE.desc());

Ответ 5

Apache Empire-db - это слой абстракции реляционной базы данных и компонент персистентности данных, который позволяет разработчикам использовать гораздо более ориентированный на SQL подход в разработке приложений, чем традиционные объектно-реляционные структуры каркаса (ORM).

Подробнее здесь: https://empire-db.apache.org/

спрашивается

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

Ответ 6

Если вы не хотите отображать строковые запросы, вы должны аннотировать свой класс как сущность и привязать его к таблице, тогда вы можете использовать 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 field
     List<StockMarket> smList = c.list();

найти объект по id:

 StockMarket sm  = entityManager.find(StockMarket.class, id);

Ответ 7

Вы можете использовать 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);
}

Вы можете увидеть больше примеров в модульных тестах проекта:

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