Автор оригинала: Vlad Mihalcea.
Вступление
В этой статье показано, как новые текстовые блоки Java могут помочь повысить читаемость JPQL, SQL-запросов или строковых значений JSON.
Еще в 2005 году я разрабатывал проект .NET, и мне очень понравилась функция C# Дословного строкового литерала , поскольку она позволяет писать многострочное строковое значение без необходимости связывать каждую отдельную строку.
Функция текстовых блоков Java 13 теперь предоставляет возможность создания многострочных значений Java String .
Посмотрите, как новые текстовые блоки #Java могут помочь вам повысить читаемость JPQL, SQL-запросов или строковых значений JSON. https://t.co/wBKLIyb0XF pic.twitter.com/H6VOKW4szH
Текстовые блоки Java для запросов JPQL или SQL
Независимо от того, выполняете ли вы JPQL или SQL-запрос без текстовых блоков, именно так будет выглядеть выполнение запроса при использовании JPA:
Listposts = entityManager .createNativeQuery( "SELECT *\n" + "FROM (\n" + " SELECT *,\n" + " dense_rank() OVER (\n" + " ORDER BY \"p.created_on\", \"p.id\"\n" + " ) rank\n" + " FROM (\n" + " SELECT p.id AS \"p.id\",\n" + " p.created_on AS \"p.created_on\",\n" + " p.title AS \"p.title\",\n" + " pc.id as \"pc.id\",\n" + " pc.created_on AS \"pc.created_on\",\n" + " pc.review AS \"pc.review\",\n" + " pc.post_id AS \"pc.post_id\"\n" + " FROM post p\n" + " LEFT JOIN post_comment pc ON p.id = pc.post_id\n" + " WHERE p.title LIKE :titlePattern\n" + " ORDER BY p.created_on\n" + " ) p_pc\n" + ") p_pc_r\n" + "WHERE p_pc_r.rank <= :rank\n", Tuple.class) .setParameter("titlePattern", "High-Performance Java Persistence %") .setParameter("rank", 5) .getResultList();
Для удобства чтения мы не хотим отображать весь запрос в одной строке, поэтому нам нужно использовать многострочную Строку . До Java 13 вы либо использовали бы String конкатенацию, либо StringBuilder для создания многострочной Строки .
Начиная с Java 13, вы можете использовать текстовые блоки, и вам даже не нужно вручную преобразовывать устаревшую многострочную Строку конкатенацию в новый формат многострочных текстовых блоков. С помощью IntelliJ IDEA вы можете нажать ALT + ENTER и выбрать опцию Заменить текстовым блоком :
После применения действия Заменить текстовым блоком вот как может выглядеть ваш запрос:
Listposts = entityManager .createNativeQuery(""" SELECT * FROM ( SELECT *, dense_rank() OVER ( ORDER BY "p.created_on", "p.id" ) rank FROM ( SELECT p.id AS "p.id", p.created_on AS "p.created_on", p.title AS "p.title", pc.id as "pc.id", pc.created_on AS "pc.created_on", pc.review AS "pc.review", pc.post_id AS "pc.post_id" FROM post p LEFT JOIN post_comment pc ON p.id = pc.post_id WHERE p.title LIKE :titlePattern ORDER BY p.created_on ) p_pc ) p_pc_r WHERE p_pc_r.rank <= :rank """, Tuple.class) .setParameter("titlePattern", "High-Performance Java Persistence %") .setParameter("rank", 5) .getResultList();
SQL – запрос намного более удобочитаем при использовании текстовых блоков Java.
Текстовые блоки Java для объектов JSON
Еще одно место, где текстовые блоки Java действительно полезны, – это когда вам нужно представить JSON, XML или HTML в вашем Java-коде.
Рассмотрим следующую Книгу сущность, имеющую атрибут JSON свойства :
entityManager.persist(
new Book()
.setId(1L)
.setIsbn("978-9730228236")
.setProperties(
"{" +
" \"title\": \"High-Performance Java Persistence\"," +
" \"author\": \"Vlad Mihalcea\"," +
" \"publisher\": \"Amazon\"," +
" \"price\": 44.99," +
" \"reviews\": [" +
" {" +
" \"reviewer\": \"Cristiano\", " +
" \"review\": \"Excellent book to understand Java Persistence\", " +
" \"date\": \"2017-11-14\", " +
" \"rating\": 5" +
" }," +
" {" +
" \"reviewer\": \"T.W\", " +
" \"review\": \"The best JPA ORM book out there\", " +
" \"date\": \"2019-01-27\", " +
" \"rating\": 5" +
" }," +
" {" +
" \"reviewer\": \"Shaikh\", " +
" \"review\": \"The most informative book\", " +
" \"date\": \"2016-12-24\", " +
" \"rating\": 4" +
" }" +
" ]" +
"}"
)
);
При преобразовании атрибута properties в текстовый блок объект JSON, несомненно, становится гораздо более читабельным:
entityManager.persist(
new Book()
.setId(1L)
.setIsbn("978-9730228236")
.setProperties("""
{
"title": "High-Performance Java Persistence",
"author": "Vlad Mihalcea",
"publisher": "Amazon",
"price": 44.99,
"reviews": [
{
"reviewer": "Cristiano",
"review": "Excellent book to understand Java Persistence",
"date": "2017-11-14",
"rating": 5
},
{
"reviewer": "T.W",
"review": "The best JPA ORM book out there",
"date": "2019-01-27",
"rating": 5
},
{
"reviewer": "Shaikh",
"review": "The most informative book",
"date": "2016-12-24",
"rating": 4
}
]
}
"""
)
);
Круто, правда?
Вывод
Наконец, в Java есть правильное решение для многострочных строковых значений. Я переключил свой Высокопроизводительный репозиторий Java на GitHub , а также учебные материалы для семинара по высокопроизводительному SQL , и результаты впечатляют.
Учитывая, что Java 13, 14, 15 и 16 не являются выпусками LTS (долгосрочной поддержки), большинство проектов Java, вероятно, будут ждать, пока Java 17 начнет внедрять эту функцию. Но для нового проекта, который будет запущен в производство после сентября 2021 года, когда предполагается выпустить Java 17, было бы неплохо начать разработку с использованием Java 14.