Yerli Sorgu

Mevcut

3.1 Giriş

Bahsetmek istediğim bir diğer yararlı şey ise NativeQuery . Bildiğiniz gibi, NativeQuery kullanarak yerel SQL'de sorgular yazabilirsiniz. Ancak, daha da ilginç olanı, sorgu sonucunu alırken sınıf eşlemesini kullanmak zorunda olmamanızdır.

Size bir örnek göstermeyi tercih ederim:

List<Object[]> persons = session.createNativeQuery("SELECT * FROM Person").list();

Bu örnekte, sorgu sonucu satırlarıyla eşleşen bir sınıfı geçmiyoruz, bunun yerine sadece bir Object nesneleri dizisi kullanıyoruz.

Bir tabloda yalnızca birkaç sütun seçmek istiyorsanız bu yararlı olabilir. Örnek:

List<Object[]> persons = session.createNativeQuery("SELECT id, name FROM Person").list();

for(Object[] person : persons) {
    Number id = (Number) person[0];
    String name = (String) person[1];
}

Bu, bir ResultSet nesnesi alıp satırlarından veri okuduğunuzda JDBC yaklaşımına biraz benzer.

Ancak Hibernate, bunu daha güvenilir hale getirmek için farklı yollar sunar. Örneğin, çıkarmak istediğiniz sütunların türünü belirleyebilirsiniz. Örnek:

Query<Object[]> query = session.createNativeQuery("SELECT id, name FROM Person");
query.addScalar("id", StandardBasicTypes.LONG);
query.addScalar("name", StandardBasicTypes.STRING);
List<Object[]> persons = query.list();

for(Object[] person : persons) {
    Long id = (Long) person[0];
    String name = (String) person[1];
}

3.2 Varlık eşleme

NativeQuery sonucunu ayrıştırırken Hibernate'in kullanması gereken sınıfı da açıkça belirtebilirsiniz . Bu farklı şekillerde yapılabilir.

Query<Person> query = session.createNativeQuery("SELECT * FROM Person")
    .addEntity(Person.class);
    .list();

Ve elbette, bildiğiniz eski güzel format:

Query<Person> query = session.createNativeQuery("SELECT * FROM Person", Person.class).list();

İlk yaklaşım yerel Hibernate yaklaşımı, ikincisi ise JPA yaklaşımıdır. JPA yaklaşımı daha kullanışlı ve özlüdür, çünkü bu standart Hibernate uzun yıllar var olduktan sonra icat edilmiştir. Ve Hibernate gelişti ve eski sürümleriyle uyumluluğu sürdürmek için eski yaklaşımları desteklemek zorunda kaldı.

Bu arada, yaklaşımı sayesinde Hibernate, sorgu sonucu eşlemesine bir sınıfı değil, birkaç sınıfı bağlamanıza olanak tanır. Örnek:

List<Phone> results = session.createNativeQuery(
    "SELECT {ph.*}, {pr.*}" +
    "FROM Phone ph" +
    "JOIN Person pr ON ph.person_id = pr.id")
.addEntity("ph", Phone.class)
.addJoin("pr", "ph.person")
.list();

for (Phone. phone : results) {
           	assertNotNull( phone.getPerson().getName() );
}

NativeQuery kullanan bu yaklaşım, veri tabanından veri seçimini hızlandırmak için kullanılabilir. Bazı sütunlara ihtiyacınız olmadığını biliyorsanız, bunları istekte dışarıda bırakabilirsiniz.

Hibernate, Cache veya LazyLoading mekanizmasını kullanmak istese bile tüm alt varlıkları aynı anda yükleyebilirsiniz . Ayrıca, alt varlıklarınızın veritabanında birçok sütunu olabilir ve bunlardan yalnızca bazılarını seçebilirsiniz.

3.3 DTO eşlemesi

Hazırda Bekletme, sonucu eşlemek için Varlık dışı sınıfları kullanmanıza da izin verir. Ek açıklaması olmayan ve herhangi bir tabloya eşlenmemiş sınıflar.

Örnek:

public class PersonSummaryDTO {
    private Number id;
    private String name;

    public Number getId() {
    	return id;
    }

    public void setId(Number id) {
    	this.id = id;
    }

    public String getName() {
    	return name;
    }

    public void setName(String name) {
    	this.name = name;
	}
}

List<PersonSummaryDTO> dtos = session.createNativeQuery(
    "SELECT p.id as \"id\", p.name as \"name\" FROM Person p")
.setResultTransformer(Transformers.aliasToBean(PersonSummaryDTO.class) )
.list();

PersonSummaryDTO sınıfında herhangi bir ek açıklama bulunmadığından, SQL sorgusundaki sütunların adları, PersonSummaryDTO sınıfındaki alanların adlarıyla tam olarak eşleşmelidir.

Bu, uygulamanızın yalnızca salt okunur modda bağlı olduğu harici bir veritabanından veri okuyorsanız çok yararlı olabilir. Yani, size 50'den fazla sütunu olan tablolara erişim verildi, bunlar seçimi hızlandırmak için verileri denormalize edilmiş bir biçimde depolar.

Veya diyelim ki birisi sınıf hiyerarşisini tek bir tabloda saklamaya karar verdi ve beş yıl içinde bu tablo o kadar büyüdü ki şeytan bacağını kıracak. Bu tablodan birkaç sütun (Id ve username) seçmeniz ve bunları müşteriye vermeniz gerekir.

Anladığınızı düşünüyorum, ancak bu konunun daha derinine inmek istiyorsanız, bağlantıdan daha fazlasını okuyabilirsiniz:

Yerel SQL Sorguları

Yorumlar
  • Popüler
  • Yeni
  • Eskimiş
Yorum bırakmak için giriş yapmalısınız
Bu sayfada henüz yorum yok