Hibernate Ders 11 – Hibernate Queries – 02

Merhaba Arkadaslar,
Bu dersimizde  bir onceki derste isledigimiz Query konusu uzerinde devam edecegiz. Ornegimize eklentiler de bulunup bir kac notasyon uzerinde denemeler yapacagiz.

Yeni bir package olusturup, bir onceki siniflarimiz olan WorkersTest ve Workers siniflarimizi refactor edip WorkerTest_2 ve Workers_2 sinifi olarak kopyaliyoruz.

Workers_2 sinifimiza @NamedQuery notasyonunu ekleyelim… @NamedQuery de HQL i kullanabiliriz.

@NamedQuery(name="ourNamedQuery.byId",query="from Workers_2 where worker_id= ?")

Burada name alani ile query’mize diledigimiz ismi veriyoruz, ve query alanina gecerli sorgumuzu yapiyoruz. Bunun nasil bir faydasi olabilir, bu islemi bir cok yerde kullandigimizi dusunelim, @NamedQuery alaninda kucuk bir degisiklik ile tek hamlede tum projede degisiklik yapabilmemiz mumkun, diger turlu sorguyu yaptigimiz her yerde degisikligi yapmamiz gerekirdi bu da vakit kaybi ve hatalara neden olurdu.

Bir de @NamedNativeQuery i ekleyelim. Bu notasyon ile SQL sorgularini yazabiliriz.

@NamedNativeQuery(name="ourNamedNativeQuery.byName", 
query="Select * from Workers_new_table where name=?",resultClass=Workers_2.class)

name alani sorgumuzun adi, query alani ise yazdigimiz sorgumuz.
resultClass=Workers_2.class alani eklenmezse suna benzer bır hata aliriz.

Exception in thread “main” org.hibernate.cfg.NotYetImplementedException: Pure native scalar queries are not yet supported

Ornegimize bir de @Table(name=”Workers_new_table”) notasyonu ekliyoruz, ve tablo alanimizi degistiriyoruz. Burada kucuk bir detaydan bahsetmek icin bu notasyonu ekledim.
Dikkat ederseniz @NamedQuery icin sorgumuzda,Workers_2 yi @NamedNativeQuery icin Workers_new_table i kullandim.

@NamedNativeQuery icin Workers_new_table yerine Workers_2 yazarsak,

@NamedNativeQuery(name="ourNamedNativeQuery.byName",
query="Select * from Workers_2 where name=?",resultClass=Workers_2.class)

Suna benzer bir hata aliriz.
ERROR: relation “workers_2” does not exist
Bizim artik workers_2 adinda bir tablomuz yok, burada SQL sorgulari calistigi icin, aslinda biz olmayan bir tabloyu sorguluyoruz.Bu nedenle bize hata donduruyor. Artik yeni tablomuzunun adi Workers_new_table
Ayni sekilde su sekilde yazarsak;

@NamedQuery(name="ourNamedQuery.byId",query="from Workers_new_table where worker_id= ?")

Workers_new_table is not mapped [from Workers_new_table where worker_id= ?

seklinde bir hata alabiliriz. HQL , entity siniflariyla calistigi icin burada entity sinifimizin ismi olmak zorundadir, yani Workers_2.

Workers_2 sinifimizda gerekli notasyonlari yaptik sirada WorkersTest_2 sinifimiz var.
Bir onceki ornegimizde oldugu gibi tablomuza kayitlari ekliyoruz.

Workers_2 workers;
for (int i = 1; i <= 10; i++) {
workers = new Workers_2("WorkerName " + i, "WorkerSurname" + i, i * 50);
session.save(workers);
}
@NamedQuery(name="ourNamedQuery.byId",query="from Workers_new_table where worker_id= ?")
Query query = session.getNamedQuery("ourNamedQuery.byId");
query.setInteger(0, 5);

 

Dikkat ederseniz query ismimiz olan “ourNamedQuery.byId” ismini veriyoruz
Burada id degeri 5 veriyoruz ve burada ? isareti yerine 5 geliyor boylece diledigimiz kaydi cekmis oluyoruz.

@NamedNativeQuery(name="ourNamedNativeQuery.byName", 
query="Select * from Workers_new_table where name=?",resultClass=Workers_2.class)

icin kodumuz..

query = session.getNamedQuery("ourNamedNativeQuery.byName");
query.setString(0, "WorkerName 7");

Burada da name den yararandigimiz icin “WorkerName 7” veriyoruz ve boylece tablomuzdan Select * from Workers_new_table where name=’WorkersName7′ sorgusunu gerceklestirmis oluyoruz.

Workers_2.java

package hibernate11_Queries_2;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import org.hibernate.annotations.NamedNativeQuery;

/**
*
* @author Levent
*/
@Entity
@NamedQuery(name="ourNamedQuery.byId",query="from Workers_new_table where worker_id= ?")
@NamedNativeQuery(name="ourNamedNativeQuery.byName", query="Select * from Workers_new_table where name=?",resultClass=Workers_2.class)
@Table(name="Workers_new_table")
public class Workers_2 implements Serializable {

private int worker_id;
private String name;
private String surname;
private int salary;

public Workers_2() {
}

public Workers_2(String name, String surname, int salary) {
this.name = name;
this.surname = surname;
this.salary = salary;
}

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
public int getWorker_id() {
return worker_id;
}

public void setWorker_id(int worker_id) {
this.worker_id = worker_id;
}

public String getName() {
return name;
}

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

public String getSurname() {
return surname;
}

public void setSurname(String surname) {
this.surname = surname;
}

public int getSalary() {
return salary;
}

public void setSalary(int salary) {
this.salary = salary;
}

}


WorkersTest_2

package hibernate11_Queries_2;

import java.util.Iterator;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

/**
*
* @author Levent
*/
public class WorkersTest_2 {

public static void main(String[] args) {
AnnotationConfiguration config = new AnnotationConfiguration();
config.addAnnotatedClass(Workers_2.class);
config.configure("hibernate.cfg.xml");

new SchemaExport(config).create(true, true);

SessionFactory factory = config.buildSessionFactory();
Session session = factory.getCurrentSession();
session.beginTransaction();

Workers_2 workers;
for (int i = 1; i <= 10; i++) {
workers = new Workers_2("WorkerName " + i, "WorkerSurname" + i, i * 50);
session.save(workers);

}

Query query = session.getNamedQuery("ourNamedQuery.byId");
query.setInteger(0, 5);

List list = (List) query.list();

for (Workers_2 worker : list) {
System.out.println(worker.getName() + " " + worker.getSurname() + " " + worker.getSalary());
}

query = session.getNamedQuery("ourNamedNativeQuery.byName");
query.setString(0, "WorkerName 7");
list = (List) query.list();
for (Workers_2 worker : list) {
System.out.println(worker.getName() + " " + worker.getSurname() + " " + worker.getSalary());
}

session.getTransaction().commit();

}
}

Uygulamamizi calistirip sonuclari gorelim.
Tabloya alanlarimizi ekledik.

hibernate_11_db

Netbeanste Output alanindaki ciktilarimiz.

hibernate_11_output

Dersimizin burada sonuna geliyoruz.

kaynak dosyalar: HibernateTutorial_v11
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
injavawetrust

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *