3.1 Pambuka

Bab liya sing migunani sing dakkarepake yaiku NativeQuery . Kaya sing wis dingerteni, nggunakake NativeQuery, sampeyan bisa nulis pitakon ing SQL asli. Nanging, sing luwih menarik yaiku sampeyan ora kudu nggunakake pemetaan kelas nalika entuk asil pitakon.

Aku luwih seneng nuduhake sampeyan conto:

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

Ing conto iki, kita ora ngliwati kelas sing cocog karo baris asil pitakon, nanging mung nggunakake array obyek Obyek.

Iki bisa migunani yen sampeyan pengin milih mung sawetara kolom ing tabel. Tuladha:


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];
}

Iki meh padha karo pendekatan JDBC nalika sampeyan entuk obyek ResultSet lan maca data saka baris kasebut.

Nanging, Hibernate nawakake macem-macem cara kanggo nggawe iki luwih dipercaya. Contone, sampeyan bisa nemtokake jinis kolom sing pengin dikurangi. Tuladha:


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 Pemetaan entitas

Sampeyan uga bisa kanthi jelas nemtokake kelas sing kudu digunakake Hibernate nalika parsing asil NativeQuery . Iki bisa ditindakake kanthi cara sing beda-beda.


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

Lan mesthi, format lawas sing apik sing sampeyan ngerti:


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

Pendekatan pisanan yaiku pendekatan Hibernate asli lan sing kapindho yaiku pendekatan JPA. Pendekatan JPA luwih trep lan ringkes, amarga standar iki diciptakake sawise Hibernate ana pirang-pirang taun. Lan Hibernate ngalami évolusi lan dipeksa ndhukung pendekatan lawas kanggo njaga kompatibilitas karo versi lawas.

Miturut cara, amarga pendekatan kasebut, Hibernate ngidini sampeyan ora nyambungake siji kelas menyang pemetaan asil pitakon, nanging sawetara kelas. Tuladha:


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() );
}

Pendekatan iki nggunakake NativeQuery bisa digunakake kanggo nyepetake pilihan data saka database. Yen sampeyan ngerti yen sampeyan ora perlu sawetara kolom, sampeyan bisa ninggalake ing panjalukan.

Sampeyan uga bisa mbukak kabeh entitas anak bebarengan, sanajan Hibernate pengin nggunakake Cache utawa mekanisme LazyLoading . Kajaba iku, entitas anak sampeyan bisa uga duwe akeh kolom ing database, lan sampeyan mung bisa milih sawetara.

3.3 pemetaan DTO

Hibernate uga ngidini sampeyan nggunakake kelas non-Entity kanggo pemetaan asil. Kelas sing ora duwe anotasi lan ora dipetakan menyang tabel apa wae.

Tuladha:

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();

Amarga ora ana anotasi ing kelas PersonSummaryDTO, jeneng kolom ing query SQL kudu cocog karo jeneng kolom kelas PersonSummaryDTO.

Iki bisa migunani banget yen sampeyan maca data saka database eksternal sing aplikasi sampeyan mung disambungake ing mode mung maca. Sing, sampeyan diwenehi akses menyang tabel sing duwe 50+ kolom, padha nyimpen data ing wangun denormalized kanggo nyepetake pilihan.

Utawa ayo ngomong yen ana wong sing mutusake kanggo nyimpen hirarki kelas ing siji meja, lan ing limang taun tabel iki saya tambah akeh, mula Iblis bakal ngrusak sikile. Sampeyan kudu milih saperangan kolom saka tabel iki (Id lan jeneng panganggo) lan menehi menyang klien.

Aku rumangsa ngerti, nanging yen sampeyan pengin nyilem luwih jero babagan topik iki, sampeyan bisa maca liyane ing link:

Native SQL Queries