यह एक बहुत ही सामान्य प्रश्न है, इसलिए मैंने इस उत्तर को एक लेख में बदलने का फैसला किया ।
जावा 13 और उसके बाद
मल्टीलाइन स्ट्रिंग्स अब टेक्स्ट ब्लॉक के माध्यम से जावा में समर्थित हैं । जावा 13 और 14 में, इस सुविधा से आपको ––enable–preview
अपनी परियोजना बनाते और चलाते समय विकल्प सेट करने की आवश्यकता होती है । इस जावा प्रलेखन की जाँच करें अधिक जानकारी के लिए।
अब, जावा 13 से पहले, यह है कि आप एक प्रश्न कैसे लिखेंगे:
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();
जावा 13 टेक्स्ट ब्लॉक के लिए धन्यवाद, आप इस प्रश्न को इस प्रकार से फिर से लिख सकते हैं:
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();
बहुत अधिक पठनीय, सही?
आईडीई समर्थन
IntelliJ IDEA String
नए बहुस्तरीय String
प्रारूप में विरासत संगति ब्लॉकों को बदलने के लिए समर्थन प्रदान करता है :
JSON, HTML, XML
मल्टीलाइन है String
विशेष रूप से उपयोगी है जब JSON, एचटीएमएल, या XML लेखन है।
String
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" +
" }" +
" ]" +
"}"
)
);
भागने के पात्रों और दोहरे उद्धरण चिह्नों और प्लस संकेतों की प्रचुरता के कारण आप JSON को मुश्किल से पढ़ सकते हैं।
जावा टेक्स्ट ब्लॉक के साथ, 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
}
]
}
"""
)
);
जब से मैंने 2004 में C # का उपयोग किया था, तब से मैं जावा में इस सुविधा को प्राप्त करना चाहता था, और अब अंत में हमारे पास यह है।
string1 + string2
एक नई स्ट्रिंग ऑब्जेक्ट आवंटित करते हैं और दोनों इनपुट स्ट्रिंग्स से वर्णों की प्रतिलिपि बनाते हैं। यदि आप n स्ट्रिंग्स को एक साथ जोड़ रहे हैं, तो आप n-1 आवंटन और लगभग (n ^ 2) / 2 वर्ण प्रतियाँ कर रहे हैं। StringBuilder, दूसरी ओर, प्रतियां और reallocates कम बार (हालांकि यह अभी भी दोनों करता है जब आप इसके आंतरिक बफर के आकार से अधिक हो जाते हैं)। सैद्धांतिक रूप से, ऐसे मामले हैं जहां संकलक + को स्ट्रिंगबर्ल का उपयोग करने के लिए परिवर्तित कर सकता है लेकिन व्यवहार में कौन जानता है।