Aşağıdaki PostgreSQL sorgusunu jOOQ'a dönüştürmeye çalışıyorum ve bu sorunu çözmek için yeterli yöntem bulamıyorum. İşte sorgu:
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;
Şimdiye kadar jOOQ'da bulduğum şey buydu:
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 kodunu çalıştırdığımda şu istisnayı alıyorum:
Sınıf org.jooq.impl.JSONArray yazın VARSAYILAN lehçesinde desteklenmez
Bu istisnayı Google'da araştırdım ve bu soruda yalnızca bu benzer istisnayı buldum . PostgreSQL to_jsonişlevinin bu dönüşümünü ve verilen aut (hor) / cat (egory) tablosunun tüm alanlarında DISTINCT tutan array_agg () kombinasyonunu çözmek için uygun bir çözüm var mı ?
GÜNCELLEME : Bu, jOOQ'da tür güvenli olmayan bir şekilde sorgu yazmak için kullandığım başka bir yoldur:
dslContext.resultQuery(DBQueries.GET_ALL_BOOKS_BY_AUTHOR_ID, Long.valueOf(authorId)));
... ve işte DBQueries.GET_ALL_BOOKS_BY_AUTHOR_IDdeğişken için kod :
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, istediğimi elde etmek için resultQuery () yöntemini nasıl kullandığımın net olması için sorumu güncelledim. Bunu jOOQ'da olabildiğince güvenli bir şekilde nasıl başaracağımı soruyorum çünkü PostgreSQL to_json()işlevini KULLANMAYARAK başarmanın mümkün olup olmadığını bilmediğim daha karmaşık sorgularım var . Mesela ben gibi bir şey oluşturmak istiyorum bu bytefish.de web sitesinin gönderilen bağlantının bölümündeki "04_create_functions.sql" gibi jOOQ içinde.
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)
8 tablonun dahil olduğu (kitap) SİPARİŞLER için RAPOR için aynı şeyi yapmaya çalışıyorum (jOOQ'da daha basit bir problem olan JsonArray'i çözmeye çalıştığım için bu sorguyu buraya göndermedim) .
Fieldifadeyi ( DSL.jsonArray()) DSL.val()sarmalıyorsunuz. Bu işe yaramıyor ve istisnanızın nedeni buJSONdiziyi o şekilde sarmalayarak henüz diziye dönüştüremezsiniz . jOOQ bununla kastettiğin şeyin to_jsonperde arkasını aramak olduğunu bilmiyor . JOOQ 3.13'ten itibaren, bazı düz SQL şablonlarını kullanmaya (aşağıdaki örneğe bakın) başvurmanız gerekecek veya alternatif olarak, bir diziyi SQL mantığınızda JSON'a dönüştürmeden alıp yalnızca Java istemci mantığınızda JSON'a çevireceksiniz. .Düz SQL şablonu örneği:
DSL.field("to_json({0})", JSON.class, DSL.arrayAggDistinct(AUTHOR.AUTHOR_ID))
JOOQ 3.14'ün standart SQL JSON API ve SQL Server'ın maddesi aracılığıyla çok daha fazla JSON işlevselliğini destekleyeceğini unutmayın FOR JSON:
JSON_ARRAY, JSON_OBJECT, JSON_VALUEFonksiyon desteğiJSON_ARRAYAGG destekJSON_OBJECTAGG destekJSON_TABLE tablo değerli fonksiyon desteğiJSON_EXISTS tahmin desteğiVe:
FOR JSONsözdizimi desteği ve emülasyonu@Lukas_Eder'in bu sorunu çözmek için belirttiği gibi, aşağıdaki örnekte olduğu gibi düz SQL şablonuyla JSON nesnesi oluşturmak gerekir:
DSL.field("to_json({0})", JSON.class, DSL.arrayAggDistinct(AUTHOR.AUTHOR_ID))
Dokümantasyonda yukarıda belirtilen yöntem hakkında biraz daha okudum ve yöntemi kendi ihtiyacım için nasıl değiştirebileceğime dair fikir edindim (PostgreSQL sözdiziminde söz konusu postaya eşit olmak için)
DSL.field( "to_json(array_agg(DISTINCT author.*))", JSON.class, DSL.arrayAgg(AUTHOR.AUTHOR_ID) ).as("authors")
Jana Duggar, aşkı arayışı konusunda açıktı. İşte konu hakkında söylediği her şey ve beş yıllık evlilik penceresi.
Outlander'ın yıldızı Sam Heughan kısa süre önce kendisini yıldız yapan rol olan Jamie Fraser'ı hatırlamak için setten ne alacağını açıkladı.
'She Loves You' bir saatte yazıldı, bir günde kaydedildi ve kariyerlerinin en iyi performanslarından birine sahip The Beatles şarkısı oldu.
Dolly Parton ve büyükannesi Bessie'nin özel bir ilişkisi vardı. Büyükanne Parton çok hastaydı ama bu Dolly'nin ona şaka yapmasını engellemedi.
Meşe veya ceviz ağacının sert olduğunu düşünebilirsiniz, ancak dünyanın en sert ağaçları söz konusu olduğunda, onlara yaklaşamazlar bile.
Okyanus güzelliklerle dolu, ama aynı zamanda gezegenimizin en korkunç deniz canlılarından bazılarını da içinde barındırıyor. Bu hayvanların çoğu, okyanus yüzeyinin çok altında, derin denizin karanlık ve yüksek basınçlı dünyasında gizleniyor.
Düşman yaratıklarla savaşıyorsanız veya PvP senaryolarına hazırlanıyorsanız, Minecraft'taki en iyi kılıç büyülerini bilmek size büyük bir avantaj sağlayabilir. Kılıçları büyülemek daha fazla hasar vermenizi, yaratıklardan düşen düşman sayısını artırmanızı ve kılıcınızın dayanıklılığını uzatmanızı sağlar.
Sosyalist ülkelerden bahsedildiğinde, genellikle tam devlet kontrolü ve özel mülkiyetin olmadığı düşünülür. Ancak pratikte sosyalist ekonomiler büyük farklılıklar gösterir.
“Children”dan ünlü bir konuk oyuncu ve bazı yıkıcı haberler yayınlanıyor
Bu RAV4'ün mükemmel durumda olduğu ve sandalye oyununa hazır olduğu iddia ediliyor.
İtfaiye ekiplerinin yangını söndürmeye çalıştığı görüntüler drone ile görüntülendi.
Eyes of Wakanda doğrudan MCU'ya bağlanıyor ve ayrıca X-Men '97, What If..., Daredevil ve daha fazlasıyla ilgili güncellemeler sunuyor.
'Laguna Beach', 2000'lerin ortalarında lise öğrencileri Lauren Conrad, Kristin Cavallari, Stephen Colletti ve daha fazlasının hayatlarını takip ediyordu. İşte MTV gerçeklik dizisinin oyuncu kadrosunun şu anki hali.
Ava Gardner, Mickey Rooney ve Frank Sintra ile evlenecekti ve birkaç Hollywood yıldızıyla daha çıktı. İşte Ava Gardner'ın çıkma geçmişine bir bakış.
John Cleese, eşi Jennifer Wade ile 2012 yılında evlendi. John Cleese'in eşi Jennifer Wade hakkında bilmeniz gereken her şey burada.
Michael C. Hall, 2016 yılından bu yana eşi Morgan Macgregor ile evli. Michael C. Hall'un eşi hakkında bilmeniz gereken her şey burada.
Çoğu zaman olduğu gibi birdenbire gözüme çarpıyor Her şey yeniden yarı yolda <Hayır, Pasifik'te kesip attığınız değil, karnavalda olan> Her manşet yüksek sesle… ..
2022'de GPT-3'ün piyasaya sürülmesiyle yazma becerisinin önemi azalmış gibi görünüyor. AI ile, zayıf yazıya sahip kişiler de kaliteli personel oluşturabilir.
Günümüzün hızlı tempolu ve rekabetçi dünyasında, kişinin kariyeri kişisel gelişim, finansal istikrar ve genel yaşam memnuniyetinde önemli bir rol oynamaktadır. Bununla birlikte, birçok kişi profesyonel yaşamlarında giderek tükenmekte olan amansız bir durgunluk ve tatminsizlik döngüsüne kapılmış durumda.
Geçen hafta PressGazette (İngiliz medya haber sitesi) aracılığıyla gönderilen bir basın bildirisi fark ettim. Makale, Scandi podcast barındırma ve reklamcılık şirketi Acast'ın podcasting alanında "muhtemelen en etkili" yayıncılardan oluşan bir konsorsiyuma liderlik edeceğini duyurdu.