Jawaban:
Berikut cuplikan dari hql yang kami gunakan. (Nama telah diubah untuk melindungi identitas)
String queryString = "select distinct f from Foo f inner join foo.bars as b" +
" where f.creationDate >= ? and f.creationDate < ? and b.bar = ?";
return getHibernateTemplate().find(queryString, new Object[] {startDate, endDate, bar});
Perlu dicatat bahwa distinct
kata kunci di HQL tidak langsung dipetakan ke distinct
kata kunci di SQL.
Jika Anda menggunakan distinct
kata kunci di HQL, terkadang Hibernate akan menggunakan distinct
kata kunci SQL, tetapi dalam beberapa situasi akan menggunakan transformator hasil untuk menghasilkan hasil yang berbeda. Misalnya saat Anda menggunakan gabungan luar seperti ini:
select distinct o from Order o left join fetch o.lineItems
Dalam kasus ini, tidak mungkin untuk menyaring duplikat di tingkat SQL, jadi Hibernate menggunakan ResultTransformer
untuk menyaring duplikat setelah kueri SQL dilakukan.
lakukan sesuatu seperti ini lain kali
Criteria crit = (Criteria) session.
createCriteria(SomeClass.class).
setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
List claz = crit.list();
Anda juga dapat menggunakan Criteria.DISTINCT_ROOT_ENTITY
dengan kueri Hibernate HQL.
Contoh:
Query query = getSession().createQuery("from java_pojo_name");
query.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
return query.list();
Saya memiliki beberapa masalah dengan transformator hasil yang digabungkan dengan kueri HQL. Ketika saya mencoba
final ResultTransformer trans = new DistinctRootEntityResultTransformer();
qry.setResultTransformer(trans);
itu tidak berhasil. Saya harus mengubah secara manual seperti ini:
final List found = trans.transformList(qry.list());
Dengan API Kriteria, transformator bekerja dengan baik.
Permintaan utama saya terlihat seperti ini dalam model:
@NamedQuery(name = "getAllCentralFinancialAgencyAccountCd",
query = "select distinct i from CentralFinancialAgencyAccountCd i")
Dan saya masih belum mendapatkan apa yang saya anggap sebagai hasil yang "berbeda". Mereka hanya dibedakan berdasarkan kombinasi tombol utama di atas tabel.
Jadi, DaoImpl
saya menambahkan perubahan satu baris dan akhirnya mendapatkan pengembalian "berbeda" yang saya inginkan. Contohnya adalah daripada melihat 00 empat kali, sekarang saya hanya melihatnya sekali. Ini kode yang saya tambahkan ke DaoImpl
:
@SuppressWarnings("unchecked")
public List<CacheModelBase> getAllCodes() {
Session session = (Session) entityManager.getDelegate();
org.hibernate.Query q = session.getNamedQuery("getAllCentralFinancialAgencyAccountCd");
q.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); // This is the one line I had to add to make it do a more distinct query.
List<CacheModelBase> codes;
codes = q.list();
return codes;
}
Saya harap ini membantu! Sekali lagi, ini mungkin hanya berfungsi jika Anda mengikuti praktik pengkodean yang mengimplementasikan layanan, dao, dan jenis model proyek.
Misalkan Anda memiliki Entitas Pelanggan yang dipetakan ke tabel CUSTOMER_INFORMATION dan Anda ingin mendapatkan daftar nama depan pelanggan yang berbeda. Anda dapat menggunakan potongan di bawah ini untuk mendapatkan yang sama.
Query distinctFirstName = session.createQuery("select ci.firstName from Customer ci group by ci.firstName");
Object [] firstNamesRows = distinctFirstName.list();
Saya harap ini membantu. Jadi di sini kami menggunakan grup dengan alih-alih menggunakan kata kunci yang berbeda.
Juga sebelumnya saya merasa sulit untuk menggunakan kata kunci yang berbeda ketika saya ingin menerapkannya ke beberapa kolom. Misalnya saya ingin mendapatkan daftar firstName yang berbeda, lastName maka kelompok dengan hanya akan bekerja. Saya mengalami kesulitan dalam menggunakan perbedaan dalam kasus ini.
Saya mendapat jawaban untuk Hibernate Query Language untuk menggunakan bidang Berbeda. Anda dapat menggunakan * PILIH DISTINCT (TO_CITY) FROM FLIGHT_ROUTE *. Jika Anda menggunakan kueri SQL , itu mengembalikan Daftar String. Anda tidak dapat menggunakannya untuk mengembalikan nilai dengan Kelas Entitas. Jadi Jawaban untuk mengatasi jenis Masalah tersebut adalah menggunakan HQL dengan SQL .
FROM FLIGHT_ROUTE F WHERE F.ROUTE_ID IN (SELECT SF.ROUTE_ID FROM FLIGHT_ROUTE SF GROUP BY SF.TO_CITY);
Dari pernyataan query SQL didapat DISTINCT ROUTE_ID dan input sebagai List. Dan kueri IN memfilter TO_CITY yang berbeda dari IN (Daftar).
Jenis pengembalian adalah jenis Entity Bean. Jadi Anda bisa melakukannya di AJAX seperti AutoComplement .
Semoga semuanya baik-baik saja
Anda dapat membuat kata kunci yang berbeda dalam pembuat kriteria Anda seperti ini.
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Orders> query = builder.createQuery(Orders.class);
Root<Orders> root = query.from(Orders.class);
query.distinct(true).multiselect(root.get("cust_email").as(String.class));
Dan buat konstruktor bidang di kelas model Anda.
Jika Anda perlu menggunakan kata kunci baru untuk DTO kustom dalam pernyataan pemilihan Anda dan membutuhkan elemen yang berbeda , gunakan new outside of new seperti berikut-
select distinct new com.org.AssetDTO(a.id, a.address, a.status) from Asset as a where ...