Đây là một câu hỏi rất phổ biến, vì vậy tôi quyết định biến câu trả lời này thành một bài viết .
Java 13 và hơn thế nữa
Chuỗi Multiline hiện được hỗ trợ trong Java thông qua Khối văn bản . Trong Java 13 và 14, tính năng này yêu cầu bạn đặt ––enable–preview
tùy chọn khi xây dựng và chạy dự án của bạn. Kiểm tra tài liệu Java này để biết thêm chi tiết.
Bây giờ, trước Java 13, đây là cách bạn viết truy vấn:
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();
Nhờ Khối văn bản Java 13, bạn có thể viết lại truy vấn này như sau:
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();
Dễ đọc hơn nhiều, phải không?
Hỗ trợ IDE
IntelliJ IDEA cung cấp hỗ trợ để chuyển đổi các String
khối kết nối kế thừa sang String
định dạng đa dòng mới :
JSON, HTML, XML
Đa dòng String
đặc biệt hữu ích khi viết JSON, HTML hoặc XML.
Xem xét ví dụ này bằng cách sử dụng String
phép nối để xây dựng chuỗi JSON bằng chữ:
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" +
" }" +
" ]" +
"}"
)
);
Bạn hầu như không thể đọc JSON do các ký tự thoát và sự phong phú của dấu ngoặc kép và dấu cộng.
Với Khối văn bản Java, đối tượng JSON có thể được viết như thế này:
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
}
]
}
"""
)
);
Kể từ khi tôi sử dụng C # vào năm 2004, tôi đã muốn có tính năng này trong Java và cuối cùng chúng tôi đã có nó.
string1 + string2
việc phân bổ một đối tượng chuỗi mới và sao chép các ký tự từ cả hai chuỗi đầu vào. Nếu bạn thêm n Chuỗi với nhau, bạn sẽ thực hiện phân bổ n-1 và khoảng (n ^ 2) / 2 bản sao ký tự. StringBuilder, mặt khác, sao chép và phân bổ lại ít thường xuyên hơn (mặc dù nó vẫn làm cả khi bạn vượt quá kích thước của bộ đệm bên trong của nó). Về mặt lý thuyết, có những trường hợp trình biên dịch có thể chuyển đổi + để sử dụng StringBuilder nhưng trong thực tế ai biết được.