Dies ist eine sehr häufige Frage, daher habe ich beschlossen, diese Antwort auch in einen Artikel umzuwandeln .
Java 13 und darüber hinaus
Mehrzeilige Zeichenfolgen werden jetzt in Java über Textblöcke unterstützt . In Java 13 und 14 müssen Sie für diese Funktion die Einstellungen vornehmen––enable–preview
Option wenn Sie Ihr Projekt erstellen und ausführen. Weitere Informationen finden Sie in dieser Java-Dokumentation .
Vor Java 13 schreiben Sie eine Abfrage folgendermaßen:
List<Tuple> posts = 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();
Dank Java 13-Textblöcken können Sie diese Abfrage wie folgt umschreiben:
List<Tuple> posts = 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();
Viel lesbarer, oder?
IDE-Unterstützung
IntelliJ IDEA bietet Unterstützung für die Umwandlung älterer String
Verkettungsblöcke in das neue mehrzeilige String
Format:
JSON, HTML, XML
Die mehrzeilige String
ist besonders nützlich, wenn Sie JSON, HTML oder XML schreiben.
Betrachten Sie dieses Beispiel mithilfe der String
Verkettung, um ein JSON-Zeichenfolgenliteral zu erstellen:
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" +
" }" +
" ]" +
"}"
)
);
Sie können den JSON aufgrund der entweichenden Zeichen und der Fülle an doppelten Anführungszeichen und Pluszeichen kaum lesen.
Mit Java-Textblöcken kann das JSON-Objekt folgendermaßen geschrieben werden:
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
}
]
}
"""
)
);
Seit ich 2004 C # verwendet habe, wollte ich diese Funktion in Java haben, und jetzt haben wir sie endlich.
string1 + string2
ein neues Zeichenfolgenobjekt zuweisen und die Zeichen aus beiden Eingabezeichenfolgen kopieren. Wenn Sie n Strings addieren, führen Sie n-1 Zuweisungen und ungefähr (n ^ 2) / 2 Zeichenkopien durch. StringBuilder hingegen kopiert und ordnet weniger häufig neu zu (obwohl es immer noch beides tut, wenn Sie die Größe seines internen Puffers überschreiten). Theoretisch gibt es Fälle, in denen der Compiler + konvertieren könnte, um StringBuilder zu verwenden, aber in der Praxis, wer weiß.