ฉันพยายามแปลงแบบสอบถาม PostgreSQL ต่อไปนี้เป็น jOOQ และดูเหมือนจะไม่พบวิธีที่เพียงพอในการแก้ไขปัญหานี้ นี่คือคำถาม:
SELECT b.book_id AS b_id, b.title, b.price, b.amount, b.is_deleted,
to_json(array_agg(DISTINCT aut.*)) as authors,
to_json(array_agg(DISTINCT cat.*)) as categories
FROM book b
LEFT JOIN author_book AS ab ON b.book_id = ab.book_id
LEFT JOIN author AS aut ON ab.author_id = aut.author_id
LEFT JOIN category_book AS cb ON b.book_id = cb.book_id
LEFT JOIN category AS cat ON cb.category_id = cat.category_id
GROUP BY b_id ORDER BY b_id ASC;
จนถึงตอนนี้นี่คือสิ่งที่ฉันคิดใน jOOQ:
dslContext
.select(BOOK.BOOK_ID, BOOK.TITLE, BOOK.PRICE, BOOK.AMOUNT, BOOK.IS_DELETED,
DSL.val(DSL.jsonArray(DSL.arrayAggDistinct(AUTHOR.AUTHOR_ID),
DSL.arrayAggDistinct(AUTHOR.FIRST_NAME),
DSL.arrayAggDistinct(AUTHOR.LAST_NAME))
).cast(SQLDataType.JSON),
DSL.val(DSL.jsonArray(DSL.arrayAggDistinct(CATEGORY.CATEGORY_ID),
DSL.arrayAggDistinct(CATEGORY.NAME),
DSL.arrayAggDistinct(CATEGORY.IS_DELETED))
).cast(SQLDataType.JSON)
).from(BOOK
.leftJoin(AUTHOR_BOOK).on(BOOK.BOOK_ID.eq(AUTHOR_BOOK.BOOK_ID))
.leftJoin(AUTHOR).on(AUTHOR_BOOK.AUTHOR_ID.eq(AUTHOR.AUTHOR_ID))
.leftJoin(CATEGORY_BOOK).on(BOOK.BOOK_ID.eq(CATEGORY_BOOK.BOOK_ID))
.leftJoin(CATEGORY).on(CATEGORY_BOOK.CATEGORY_ID.eq(CATEGORY.CATEGORY_ID))
).where(AUTHOR.AUTHOR_ID.eq(Long.valueOf(authorId))
).groupBy(BOOK.BOOK_ID).orderBy(BOOK.BOOK_ID.asc())
เมื่อฉันรันโค้ด jOOQ ฉันจะได้รับข้อยกเว้นดังต่อไปนี้:
พิมพ์ class org.jooq.impl.JSONArray ไม่รองรับภาษาถิ่น DEFAULT
ฉัน googled ข้อยกเว้นนี้และพบเฉพาะข้อยกเว้นที่คล้ายกันนี้ในคำถามนี้ มีวิธีแก้ปัญหาที่เหมาะสมในการแก้ไขการแปลงto_jsonฟังก์ชันPostgreSQL และการรวมกันของ array_agg () ซึ่งเก็บ DISTINCT ไว้ในทุกฟิลด์ของตาราง aut (hor) / cat (egory) ที่กำหนดหรือไม่
UPDATE : นี่เป็นอีกวิธีหนึ่งที่ฉันใช้ในการเขียนข้อความค้นหาใน jOOQ ในวิธีที่ไม่ปลอดภัย:
dslContext.resultQuery(DBQueries.GET_ALL_BOOKS_BY_AUTHOR_ID, Long.valueOf(authorId)));
... และนี่คือรหัสสำหรับDBQueries.GET_ALL_BOOKS_BY_AUTHOR_IDตัวแปร:
public class DBQueries {
//...
static String GET_ALL_BOOKS_BY_AUTHOR_ID = "SELECT b.book_id AS b_id, b.title, b.price, b.amount, b.is_deleted, " +
"to_json(array_agg(DISTINCT aut.*)) as authors, to_json(array_agg(DISTINCT cat.*)) as categories " +
"FROM book b " +
"LEFT JOIN author_book AS ab ON b.book_id = ab.book_id " +
"LEFT JOIN author AS aut ON ab.author_id = aut.author_id " +
"LEFT JOIN category_book AS cb ON b.book_id = cb.book_id " +
"LEFT JOIN category AS cat ON cb.category_id = cat.category_id " +
"WHERE aut.author_id = :id " +
"GROUP BY b_id ORDER BY b_id ASC;";
}
BTW ฉันได้อัปเดตคำถามของฉันเพื่อให้ชัดเจนว่าฉันใช้เมธอด resultQuery () เพื่อให้บรรลุสิ่งที่ฉันต้องการได้อย่างไร ฉันกำลังถามวิธีบรรลุสิ่งนี้ใน jOOQ ด้วยวิธีที่ปลอดภัยที่สุดเท่าที่จะเป็นไปได้เพราะฉันมีแบบสอบถามที่ซับซ้อนมากขึ้นซึ่งฉันไม่รู้ว่าจะทำได้หรือไม่โดยไม่ใช้to_json()ฟังก์ชันPostgreSQL ตัวอย่างเช่นฉันต้องการสร้างสิ่งนี้ใน jOOQ เช่นในส่วน "04_create_functions.sql" ของลิงก์ที่ส่งมาของเว็บไซต์ bytefish.de
get_image
--------------------------------------------------------------
{"imageid" : 1,
"hash" : "a3b0c44",
"description" : "Some Description",
"created_on" : "2015-03-09T22:00:45.111",
"comments" : [{"commentid":1, "imageid":1, "text":"Awesome!", "createdon":"2015-03-09T22:58:47.783"},
{"commentid":2, "imageid":1, "text":"This is just a second comment.", "createdon" : "2015-03-09T22:58:47.783"}],
"tags" : [{"tagid":1,"name":"Cool"},
{"tagid":2,"name":"Berlin"}]}
(1 row)
ฉันกำลังพยายามทำสิ่งเดียวกันสำหรับ REPORT สำหรับ (หนังสือ) ORDERS ซึ่งแบบสอบถามฉันมี 8 ตารางที่เกี่ยวข้อง (ฉันไม่ได้โพสต์แบบสอบถามนั้นที่นี่เพราะฉันพยายามแก้ปัญหาง่าย ๆ ใน jOOQ ซึ่งก็คือการสร้าง JsonArray) .
Fieldนิพจน์ ( DSL.jsonArray()) DSL.val()ซึ่งมีไว้สำหรับการผูกค่า ไม่ได้ผลและเป็นสาเหตุของข้อยกเว้นของคุณJSONอาร์เรย์ได้โดยการรวมอาร์เรย์ด้วยวิธีนั้น jOOQ ไม่รู้ว่าสิ่งที่คุณหมายถึงนี้เรียกว่าto_jsonอยู่เบื้องหลัง ตั้งแต่ jOOQ 3.13 คุณจะต้องหันไปใช้เทมเพลต SQL ธรรมดา (ดูตัวอย่างด้านล่าง) หรืออีกวิธีหนึ่งคือคุณดึงข้อมูลอาร์เรย์โดยไม่เปลี่ยนเป็น JSON ในตรรกะ SQL ของคุณและเปลี่ยนเป็น JSON เฉพาะในตรรกะไคลเอ็นต์ Java ของคุณ .ตัวอย่างเทมเพลต SQL ธรรมดา:
DSL.field("to_json({0})", JSON.class, DSL.arrayAggDistinct(AUTHOR.AUTHOR_ID))
โปรดทราบว่า jOOQ 3.14 จะสนับสนุนมากฟังก์ชั่นอื่น ๆ อีกมากมาย JSON ผ่านมาตรฐาน SQL JSON API และ SQL Server ของFOR JSONประโยค:
JSON_ARRAY, JSON_OBJECT, JSON_VALUEสนับสนุนฟังก์ชั่นJSON_ARRAYAGG สนับสนุนJSON_OBJECTAGG สนับสนุนJSON_TABLE รองรับฟังก์ชันที่มีมูลค่าตารางJSON_EXISTS การสนับสนุนเพรดิเคตและ:
FOR JSONรองรับไวยากรณ์SQL Server และการจำลองดังที่ @Lukas_Eder ชี้ให้เห็นเพื่อแก้ปัญหานี้จำเป็นต้องสร้างวัตถุ JSON ผ่านเทมเพลต SQL ธรรมดาเช่นในตัวอย่างต่อไปนี้:
DSL.field("to_json({0})", JSON.class, DSL.arrayAggDistinct(AUTHOR.AUTHOR_ID))
ฉันได้อ่านเพิ่มเติมเกี่ยวกับวิธีการที่กล่าวถึงข้างต้นในเอกสารประกอบและมีแนวคิดในการปรับเปลี่ยนวิธีการตามความต้องการของฉันเอง (เพื่อให้เท่ากับที่โพสต์ในไวยากรณ์ของ PostgreSQL):
DSL.field( "to_json(array_agg(DISTINCT author.*))", JSON.class, DSL.arrayAgg(AUTHOR.AUTHOR_ID) ).as("authors")
Jana Duggar เปิดใจเกี่ยวกับการค้นหาความรักของเธอ นี่คือทุกสิ่งที่เธอพูดเกี่ยวกับหัวข้อและกรอบเวลา 5 ปีสำหรับการแต่งงาน
เมื่อเร็ว ๆ นี้ แซม ฮิวแฮน นักแสดงจากเรื่อง 'Outlander' ได้เปิดเผยสิ่งที่เขาจะทำจากกองถ่ายเพื่อระลึกถึงเจมี เฟรเซอร์ บทบาทที่ทำให้เขากลายเป็นดารา
'She Loves You' เขียนขึ้นในหนึ่งชั่วโมง บันทึกเสียงในหนึ่งวัน และเป็นเพลงของ The Beatles ที่มีการแสดงที่ดีที่สุดเพลงหนึ่งในอาชีพของพวกเขา
Dolly Parton และคุณย่า Bessie มีความสัมพันธ์พิเศษ คุณยายพาร์ตันป่วยหนัก แต่นั่นไม่ได้ทำให้ดอลลี่หยุดแกล้งเธอ
คุณอาจคิดว่าไม้โอ๊คหรือฮิคคอรีเป็นไม้ที่แข็ง แต่เมื่อต้องพูดถึงไม้ที่แข็งที่สุดในโลกแล้ว พวกมันกลับไม่ใกล้เคียงเลย
มหาสมุทรเต็มไปด้วยความงาม แต่ก็ซ่อนสิ่งมีชีวิตใต้ท้องทะเลที่น่ากลัวที่สุดบางชนิดไว้เช่นกัน สัตว์เหล่านี้หลายชนิดซ่อนตัวอยู่ใต้ผิวน้ำอันมืดมิด ในโลกใต้ทะเลลึกอันแสนกดดันและมืดมิด
หากคุณกำลังต่อสู้กับศัตรูหรือกำลังเตรียมตัวสำหรับโหมด PvP การรู้ถึงการเสริมพลังดาบที่ดีที่สุดใน Minecraft จะช่วยให้คุณได้เปรียบอย่างมาก การเสริมพลังดาบจะช่วยให้คุณสร้างความเสียหายได้มากขึ้น เพิ่มจำนวนม็อบที่ดรอป และเพิ่มความทนทานของดาบ
เมื่อผู้คนพูดถึงประเทศสังคมนิยม พวกเขามักจะนึกถึงการควบคุมโดยรัฐบาลอย่างเต็มรูปแบบโดยไม่มีกรรมสิทธิ์ส่วนบุคคล แต่ในทางปฏิบัติ เศรษฐกิจแบบสังคมนิยมมีความหลากหลายอย่างมาก
“เด็ก” โผล่รับเชิญดาราดังพร้อมข่าวร้าย
RAV4 นี้อ้างว่าอยู่ในสภาพที่ดีเยี่ยมและมีไว้สำหรับการเล่นเก้าอี้ดนตรี
ภาพจากโดรนจับภาพนักดับเพลิงที่กำลังพยายามดับไฟ
Eyes of Wakanda เชื่อมโยงโดยตรงกับ MCU พร้อมอัปเดตเกี่ยวกับ X-Men '97, What If..., Daredevil และอีกมากมาย
Ava Gardner แต่งงานกับ Mickey Rooney และ Frank Sintra และเธอยังคบหาดูใจกับดาราฮอลลีวูดอีกหลายคน ต่อไปนี้คือประวัติการออกเดทของ Ava Gardner
จอห์น คลีส แต่งงานกับเจนนิเฟอร์ เวด ภรรยาของเขาในปี 2012 นี่คือทุกสิ่งที่คุณต้องรู้เกี่ยวกับเจนนิเฟอร์ เวด ภรรยาของจอห์น คลีส
Michael C. Hall แต่งงานกับ Morgan Macgregor ภรรยาของเขาตั้งแต่ปี 2016 นี่คือทุกสิ่งที่คุณต้องการทราบเกี่ยวกับภรรยาของ Michael C. Hall
Mena Suvari แต่งงานกับ Michael Hope สามีของเธอมาตั้งแต่ปี 2018 นี่คือทุกสิ่งที่ควรรู้เกี่ยวกับสามีของ Mena Suvari
มันทำให้ฉันประหลาดใจ ทันใดนั้นมันก็เกิดขึ้นบ่อยๆ มันอยู่กลางทางอีกครั้ง <ไม่ ไม่ใช่คนในมหาสมุทรแปซิฟิก คุณเป็นสีน้ำตาลแดง คนที่งานคาร์นิวัล> ทุกพาดหัวข่าวดัง…..
ในปี 2022 ด้วยการเปิดตัว GPT-3 ทักษะการเขียนดูเหมือนจะมีความสำคัญน้อยลง ด้วย AI คนที่เขียนไม่ดีก็สามารถสร้างพนักงานที่มีคุณภาพได้เช่นกัน
ในโลกที่เปลี่ยนแปลงอย่างรวดเร็วและการแข่งขันในปัจจุบัน อาชีพของคนๆ หนึ่งมีบทบาทสำคัญในการเติบโตส่วนบุคคล ความมั่นคงทางการเงิน และความพึงพอใจในชีวิตโดยรวม อย่างไรก็ตาม ผู้คนจำนวนมากพบว่าตัวเองติดอยู่ในวงจรของความเมื่อยล้าและความไม่พอใจอย่างไม่หยุดยั้ง ค่อยๆ สูญเสียชีวิตการทำงานไป
เมื่อสัปดาห์ที่แล้วฉันสังเกตเห็นข่าวประชาสัมพันธ์ที่เผยแพร่ผ่าน PressGazette (เว็บไซต์ข่าวของสื่ออังกฤษ) บทความประกาศว่า Acast ซึ่งเป็นบริษัทโฮสติ้งและโฆษณาพอดคาสต์ของ Scandi จะเป็นผู้นำกลุ่มผู้เผยแพร่ "อาจมีอิทธิพลมากที่สุด" ในพอดคาสต์