İçeriğe geç

Hibernate Named Query – Native Named Query

Spread the love

Daha önceki yazılarda hibernate in database ile ilgili bağlantıları ve queryleri yönetmek için geliştirilen bir ORM aracı olduğunu belirtmiştik.  ORM databasedeki tabloları bean xml’leri veya Annotation’lar ile eşleştirerek yönetmemizi sağlamaktaydı. Şimdide Hibernate ile kullanılan bir yöntemden bahsedeceğim. Named Query. kısaca adı konulmuş query olarak çevirebiliriz. Bir query yazılır ve bunun adı belirtilir. Bu queryleri ister model Annotation kullanıyorsak  POJO classımızda, xml kullanıyorsak xml-bean dosyamızda yazmamız gerekmektedir.  Eğer birden fazla queryi yazılacaksa bunları

1
<span class="token function">NamedQueries </span>

Annotation içine almak gerekir.

[java]

@NamedQueries(
{
@NamedQuery(
name = "findCompanyByName",
query = "from Company c where c.name = :name"
)
@NamedQuery(
name = "findCompanyById",
query = "from Company c where c.id = :id"
)
}
)
@Entity
@Table(name="company")
public class Company {

public String toString(){return id + " " + name + " " + " " + vknTckn }

int id;
String name;
String adress;
String vknTckn
@Id
@GeneratedValue(strategy=GenerationType.AUTO)

//getters and setters
}
[/java]

Named query HQL yazılır. Yani tablo ismi yerine onun eşlenen POJO objesi yazılır.  Native Named Query de ise SQL yazılır.

[java]
@NamedNativeQueries(
{
@NamedNativeQuery(
name = "findCompanyByNameNative",
query = "select * from company c where c.name = :name"
resultClass = Company.class
)

@NamedNativeQuery(
name = "findCompanyByIdNative",
query = "select * from company c where c.id = :id"
)
}
)
@Entity
@Table(name="company")
public class Company {

public String toString(){return id + " " + name + " " + " " + vknTckn }

int id;
String name;
String adress;
String vknTckn
@Id
@GeneratedValue(strategy=GenerationType.AUTO)

//getters and setters
}
[/java]

Named Queryler oluşturulduktan sonra getNamedQuery ile çağırlırlar. Queryinin içerisinde tanımlanmış bindigler ise tek tek set edilir.

[java]
Query query = session.getNamedQuery("findCompanyByName");
query.setString("name", "Samsung");
List<Company> companies=query.list();
[/java]

Named Query hibernate maping dosyalarında da kullanılır. Mapping dosyalarında kullanılırken tagi içerisine yazılır.

[sql]
<!– company.hbm.xml –>
<hibernate-mapping>
<class name="org.hiber.test.Company" table="company">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="name" type="string">
<column name="name" length="50" not-null="true" unique="true" />
</property>
<property name="adress" type="string">
<column name="adress" length="200" not-null="true" unique="true" />
</property>
<property name="vknTckn" type="string">
<column name="vkn_tckn" length="11" not-null="true" unique="true" />
</property>
</class>

<query name="findCompanyByvknTckn">
<![CDATA[from Company c where c.vknTckn = :vknTckn]]>
</query>

</hibernate-mapping>
[/sql]

Hibernate mapping dosyaları içerisine native query yazmak istersek bu sefer taglerinin açılması gerekmektedir.

[sql]

<!– company.hbm.xml –>
<hibernate-mapping>
<class name="org.hiber.test.Company" table="company">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="name" type="string">
<column name="name" length="50" not-null="true" unique="true" />
</property>
<property name="adress" type="string">
<column name="adress" length="200" not-null="true" unique="true" />
</property>
<property name="vknTckn" type="string">
<column name="vkn_tckn" length="11" not-null="true" unique="true" />
</property>
</class>

<sql-query name="findCompanyByvknTcknNative">
<return alias="company" class="org.hiber.test.Company" />
<![CDATA[select * from company s where s.vkn_tckn = :vknTckn]]>
</sql-query>
</hibernate-mapping>
[/sql]

Şeklinde yazılır. Hibernate mapping dosyalarına yazılan named queryler de POJO class larının içersini yazılanla benzer şekilde kullanılır.

Yukarıda ki örneklerde basit queryler yazdık. Ve sadece sonuçları daha önceden oluşturduğumuz Objelere denk geliyordu. Şimdi biraz daha işi zorlaştıralım. Örneğin iki table dönen bir query yazalım ve bunu kullanmaya çalışalım.

[sql]
<sql-query name="findFullCompanyById">
<![CDATA[select {c.*}, {d.*} from Company c join Detail d ON c.id=d.companyId]]>
<return alias="c" class="org.hiber.test.Company" />
<return-join alias="d" class="org.hiber.test.Detail"></return-join>
</sql-query>
[/sql]

Yukarıdaki örnekte hibarnate mapping dosyasında databaseden şirket ve detaylarını çekmekteyiz. Daha önceden tek tablo çektiğimiz için direk bunu bir liste halinde kullanabiliyorduk. Burada içinde array olan bir liste dönmektedir. Bu arraylarden indexi 0 olan ilk objemiz, indexi 1 olan ikinci objemizdir. Kullanımı iste şu şekildedir:

[java]
query = session.getNamedQuery("findFullCompanyById");
fullCompanyArray = query.list();
for(Object[] row : fullCompanyArray){
Company c = (Company) row[0];
Detail d = (Detail) row[1];
}
[/java]

Hadi işleri biraz daha karıştıralım. Sonucu elimizde olmayan bir obje dönen query yazalım. Databaseden full table i değilde sadece istediğimiz sütunları dönen bir query yazalım. Örneğin bir Person tablomuz var ve sadece isim ve yaş bizim için önemli.

[sql]
<sql-query name="mySqlQuery">
<return alias="person" class="org.hiber.test.Person">
<return-property name="name" column="myName"/>
<return-property name="age" column="myAge"/>
</return>
SELECT person.person_name AS myName,
person.person_age AS myAge
FROM PERSON person WHERE person.person_name = :name
</sql-query>
[/sql]

Yukarıda yazılan native named query de person tablosundan sadece isim ve yaş çekilmektedir. tagi ile dönülmek istenen property set edilmiştir. Person tablosundan sadece isim ve yaş çağırdığımız queryi kullanmak için aşağıdaki kodu kullanabiliriz.

[java]
query = session.getNamedQuery("mySqlQuery");
query.setString("Osman");
List<Object[]> person = query.list();
for(Object[] row : person){
String name = row.get(0);
String age = row.get(1);
}
[/java]

Tarih:Veri Tabanı

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.