Есть ли какая-либо библиотека для представления 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