Adhoc raporlama amaçları için çok dinamik SQL ifadeleri oluşturması gereken bir Java servlet uygulaması üzerinde çalışıyorum. Uygulamanın temel işlevi, önceden kodlanmış bir sorguya bir dizi adlandırılmış HTTP istek parametresi beslemek ve güzel biçimlendirilmiş bir çıktı tablosu oluşturmaktır. Tüm SQL sorgularımı XML dosyalarında depolamak ve bunları tablo biçimlendirme bilgileriyle birlikte raporlama uygulamasına yüklemek için Spring MVC ve bağımlılık enjeksiyon çerçevesini kullandım. Sonunda, raporlama gereksinimleri, mevcut parametre eşleme çerçevelerinin yeteneklerinden daha karmaşık hale geldi ve kendiminkini yazmak zorunda kaldım. Bu, geliştirmede ilginç bir alıştırmaydı ve bulabildiğim her şeyden çok daha sağlam bir parametre eşleme çerçevesi oluşturdu.
Yeni parametre eşlemeleri şöyle görünüyordu:
select app.name as "App",
${optional(" app.owner as "Owner", "):showOwner}
sv.name as "Server", sum(act.trans_ct) as "Trans"
from activity_records act, servers sv, applications app
where act.server_id = sv.id
and act.app_id = app.id
and sv.id = ${integer(0,50):serverId}
and app.id in ${integerList(50):appId}
group by app.name, ${optional(" app.owner, "):showOwner} sv.name
order by app.name, sv.name
Ortaya çıkan çerçevenin güzelliği, HTTP istek parametrelerini uygun tür denetimi ve sınır denetimi ile doğrudan sorguya işleyebilmesiydi. Giriş doğrulaması için fazladan eşleme gerekmez. Yukarıdaki örnek sorguda, serverId adlı parametre
, bir tam sayıya dönüştürülebildiğinden ve 0-50 aralığında olduğundan emin olmak için kontrol edilecektir. AppId parametresi , uzunluk sınırı 50 olan bir tamsayı dizisi olarak işlenir. ShowOwnermevcutsa ve "true" olarak ayarlanmışsa, tırnak içindeki SQL bitleri isteğe bağlı alan eşlemeleri için oluşturulan sorguya eklenecektir. field Daha fazla parametre eşlemesine sahip isteğe bağlı SQL segmentleri dahil olmak üzere birçok parametre türü eşlemesi mevcuttur. Geliştiricinin bulabileceği kadar karmaşık bir sorgu eşlemesine izin verir. Rapor yapılandırmasında, belirli bir sorgunun bir PreparedStatement aracılığıyla nihai eşleştirmelere sahip olup olmayacağını veya önceden oluşturulmuş bir sorgu olarak çalıştırılıp çalıştırılmayacağını belirlemek için kontroller bile vardır.
Örnek Http istek değerleri için:
showOwner: true
serverId: 20
appId: 1,2,3,5,7,11,13
Aşağıdaki SQL'i üretir:
select app.name as "App",
app.owner as "Owner",
sv.name as "Server", sum(act.trans_ct) as "Trans"
from activity_records act, servers sv, applications app
where act.server_id = sv.id
and act.app_id = app.id
and sv.id = 20
and app.id in (1,2,3,5,7,11,13)
group by app.name, app.owner, sv.name
order by app.name, sv.name
Spring veya Hibernate'in veya bu çerçevelerden birinin, türleri doğrulayan, diziler gibi karmaşık veri türlerine ve diğer bu tür özelliklere izin veren daha sağlam bir eşleme mekanizması sunması gerektiğini düşünüyorum. Motorumu yalnızca kendi amaçlarım için yazdım, genel sürüm için pek okunmadı. Şu anda yalnızca Oracle sorgularıyla çalışır ve kodun tamamı büyük bir şirkete aittir. Bir gün fikirlerimi alıp yeni bir açık kaynak çerçevesi oluşturabilirim, ancak mevcut büyük oyunculardan birinin bu zorluğu üstleneceğini umuyorum.