Просматривая Hacker News , я недавно наткнулся на наиболее интересную попытку Бенджи Вебера по созданию безопасных взаимодействий баз данных с Java 8 . Бенджи создал тип DSL безопасного запроса, несколько похожий на jOOQ, с тем важным отличием, что он использует ссылки на методы Java 8 для самоанализа POJO и вывода из него элементов запроса. Это лучше всего объяснить на примере:
Optional<Person> person =
from(Person.class)
.where(Person::getFirstName)
.like("%ji")
.and(Person::getLastName)
.equalTo("weber")
.select(
personMapper,
connectionFactory::openConnection);
Приведенный выше запрос может быть преобразован в следующий оператор SQL:
SELECT * FROM person WHERE first_name LIKE ? AND last_name = ?
Это действительно очень интересный подход, и мы видели подобные идеи раньше. Наиболее заметно, что такие идеи были реализованы в:
- JaQu , еще один очень интересный конкурентный продукт jOOQ , созданный Томасом Мюллером, сопровождающим популярную базу данных H2
- LambdaJ , попытка перенести лямбда-выражения в Java задолго до Java 8
- OhmDB , новое хранилище данных NoSQL с быстрым запросом DSL
Новым в подходе Бенджи является тот факт, что ссылки на методы Java 8 можно использовать вместо обращения к CGLIB и другим видам хитрости байт-кода с помощью инструментария. Примером такого трюка является экспериментальный самоанализ байт-кода JaQu для преобразования сложных логических выражений Java в SQL, называемый «естественным синтаксисом» :
Timestamp ts =
Timestamp.valueOf("2005-05-05 05:05:05");
Time t = Time.valueOf("23:23:23");
long count = db.from(co).
where(new Filter() { public boolean where() {
return co.id == x
&& co.name.equals(name)
&& co.value == new BigDecimal("1")
&& co.amount == 1L
&& co.birthday.before(new Date())
&& co.created.before(ts)
&& co.time.before(t);
} }).selectCount();
Хотя с этими идеями, безусловно, очень интересно играть, мы сомневаемся, что такие преобразования языка и байт-кода приведут к надежным результатам. Люди критикуют использование Hibernate прокси в различных сообщениях в блогах .
Мы предпочитаем подход WYSIWYG, при котором потребители API полностью контролируют происходящее. Что вы думаете о таких умных идеях?