Saya mengalami masalah saat menulis Spesifikasi Data Musim Semi yang seharusnya menyaring beberapa baris dari kueri pencarian DB.

Misalkan ada tabel dalam database. Tabel ini berisi dua kolom yang keduanya memiliki tipe int. Saya memerlukan Spesifikasi Data Musim Semi yang akan memfilter berdasarkan pembagian dua kolom tersebut. Jadi jika kolom tersebut adalah A dan B, maka perlu membandingkan A/B dengan beberapa nilai input yang diketahui.

Inilah yang saya coba lakukan (saya menggunakan Kotlin)

return Specification { root: Root<Payment>, _: CriteriaQuery<*>?, builder: CriteriaBuilder ->
        val settlement: Join<Payment, Settlement> = root.join("settlement", JoinType.INNER)

        val decimalExpression = settlement.get<Long>("decimal")
        val multiplierExpression = settlement.get<Long>("multiplier")
        val divisionExpression : Expression<Number> = builder.quot(decimalExpression, multiplierExpression)
        builder.and(
                builder.isNotNull(decimalExpression),
                builder.isNotNull(multiplierExpression),
                builder.greaterThanOrEqualTo(
                        divisionExpression,
                        someKnownLongValue
                ))
    }

Jadi settlement adalah meja saya. Fakta bahwa itu semacam bergabung tidak penting sekarang.

Kolom decimal dan multiplier adalah kolom A dan B saya (saya juga tidak memerlukan salah satu dari mereka untuk menjadi nol, jika tidak saya tidak dapat membagi). Sepertinya ini akan berhasil, tetapi ada masalah yang saya hadapi, karena jenis yang akan dibandingkan harus menerapkan metode Comparable dan CriteriaBuilder#quot() jenis pengembalian metode adalah Expression<Number>. Kelas Number tidak sebanding. Sepertinya beberapa pemain kelas diperlukan? Tapi saya tidak yakin bagaimana cara melakukannya dan apa cara yang benar untuk melakukannya.

-1
Mikhail Valiev 10 Juli 2020, 13:53

1 menjawab

Jawaban Terbaik

Menemukan solusi yang baik, alih-alih membagi, Anda bisa mengalikan kedua bagian persamaan, dengan begitu Anda tidak harus berurusan dengan kelas 'Nomor'

val multipliedExpression = builder.prod(settlement.get<Long>("multiplier"), someKnownLongValue)
builder.greaterThanOrEqualTo(
    settlement.get<Long>("decimal"),
    multipliedExpression
)
0
Mikhail Valiev 13 Juli 2020, 10:28