Solusi 1:Doktrin SQL Asli
Salah satu cara untuk mencapai ini adalah dengan menggunakan kueri MySQL asli. Ini memerlukan penggunaan SQL Asli Doktrin menampilkan dan memetakan hasil kueri menggunakan ResultSetMapping .
Saya menemukan masalah saat menjalankan kueri SQL Asli dua kali (dengan parameter berbeda), bahwa kumpulan hasil kueri kedua sama dengan yang pertama.Mengikuti pos di GitHub memecahkan ini untuk saya.
Solusi 2:Menggunakan pengoptimal internal MySQL
Menggunakan kondisi bergabung berikut akan menggunakan pengoptimal internal MySQL dan memperlakukan ini sebagai ref_or_null
tipe gabungan
SELECT a.*, b.*
FROM a
INNER JOIN b ON
a.column = b.column
OR (a.column IS NULL AND b.column IS NULL)
Kemudian dimungkinkan untuk menggunakan kondisi gabungan ini di DQL, yang akan diterjemahkan dengan baik dalam SQL untuk dioptimalkan.
Solusi 3:Tulis fungsi DQL Kustom
Saya menulis fungsi DQL khusus yang diterjemahkan dalam klausa berikut:
SELECT a.*, b.*
FROM a
INNER JOIN b ON (a.column <=> b.column) = 1
Sayangnya tidak dapat menghilangkan = 1
bagian dari klausa ini. Ini berhasil, tetapi menyebabkan mayor dampak kinerja pada kueri saya:17 detik vs 0,5 detik, untuk memberikan beberapa indikasi (non-ilmiah).
Jadi saya tidak melangkah lebih jauh ke jalan itu.