이것은 매우 일반적인 질문이므로이 답변을 기사로 전환하기로 결정했습니다 .
자바 13 이상
여러 줄 문자열은 이제 텍스트 블록을 통해 Java에서 지원됩니다 . Java 13 및 14에서이 기능을 사용하려면 ––enable–preview
프로젝트를 빌드하고 실행할 때 옵션 을 설정해야합니다 . 확인 이 자바 문서를 자세한 내용은.
이제 Java 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();
Java 13 Text Blocks 덕분에이 쿼리를 다음과 같이 다시 작성할 수 있습니다.
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();
훨씬 더 읽기 쉽습니다.
IDE 지원
IntelliJ IDEA는 레거시 String
연결 블록을 새로운 멀티 라인 String
형식으로 변환하는 기능을 지원 합니다.
JSON, HTML, XML
여러 줄 String
JSON, HTML 또는 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을 거의 읽을 수 없습니다.
Java Text Blocks를 사용하면 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 #을 사용한 이후로이 기능을 Java로 사용하고 싶었습니다.
string1 + string2
새 문자열 객체를 할당하고 두 입력 문자열 모두에서 문자를 복사 하기 때문에 더하기를 선호합니다 . n 개의 문자열을 함께 추가하는 경우 n-1 할당 및 약 (n ^ 2) / 2 문자 복사를 수행합니다. 반면에 StringBuilder는 복사 및 재 할당 횟수를 줄입니다 (내부 버퍼의 크기를 초과해도 여전히 두 가지 모두 수행됨). 이론적으로 컴파일러가 +를 변환하여 StringBuilder를 사용할 수 있지만 실제로는 알고있는 경우가 있습니다.