11 Aralık 2018 Salı

JPA persistence.xml

Giriş
JPA ile kullanılan persistence.xml  içinde genel ayarlar ve Hibernate'e öze ayarlar bulunur.

JPA ayarlarının bir kısmı javax.persistence.jdbc.abc = def şeklindedir.
Hibernate'e özel ayarlar hibernate.abc = def şeklindedir.

İskelet olarak şöyle yaparız.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="..." xmlns:xsi="..." xsi:schemaLocation="...">
 <persistence-unit name="PU" transaction-type="RESOURCE_LOCAL">
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
   <properties>
    <property name="javax.persistence.jdbc.url" value="jdbc:postgresql:DATABASE"/>
    <property name="javax.persistence.jdbc.user" value="USERNAME"/>
    <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
    <property name="javax.persistence.jdbc.password" value="PASSWORD"/>
    <property name="hibernate.cache.provider_class" value="..."/>
    <property name="hibernate.hbm2ddl.auto" value="validate"/>
  </properties>
 </persistence-unit>
</persistence>
Ayarların açıklamaları için hibernate.cfg.xml yazısına da bakabilirsiniz.

Hibernate ve MySQL
Şöyle yaparız.
<?xml version="1.0" encoding="UTF-8"?>
  <persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0">

  <persistence-unit name="demo">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
      <property name="hibernate.archive.autodetection" value="class"/>
      <property name="hibernate.format_sql" value="true"/>

      <!-- Configuration-->
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/demo"/>
      <property name="javax.persistence.jdbc.user" value="root" />
      <property name="javax.persistence.jdbc.password" value="" />
      <property name="hibernate.dialect" value="org.hibernate.dialect.MYSQLDialect"/>
      <property name="hbm2ddl.auto" value="create"/>

    </properties>
  </persistence-unit>
</persistence>
Hibernate ve PostgreSQL
Şöyle yaparız.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="..." xmlns:xsi="..." xsi:schemaLocation="...">
 <persistence-unit name="PU" transaction-type="RESOURCE_LOCAL">
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
   <properties>
    <property name="javax.persistence.jdbc.url" value="jdbc:postgresql:DATABASE"/>
    <property name="javax.persistence.jdbc.user" value="USERNAME"/>
    <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
    <property name="javax.persistence.jdbc.password" value="PASSWORD"/>
    <property name="hibernate.cache.provider_class" value="..."/>
    <property name="hibernate.hbm2ddl.auto" value="validate"/>
  </properties>
 </persistence-unit>
</persistence>
hibernate.generate_statistics
hibernate.cfg.xml Diğer Ayarlar yazısına taşıdım.

hibernate.hbm2ddl.import_files_sql_extractor
hibernate.cfg.xml Diğer Ayarlar yazısına taşıdım.

hibernate.integrator_provider
Şöyle yaparız.
<property name="hibernate.integrator_provider" value="com.mystuff.MyIntegratorProvider" />
hibernate.temp.use_jdbc_metadata_defaults
Şöyle yaparız.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
  <persistence-unit name="entityManager">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
      <properties>
        <property name="hibernate.dialect" 
                  value="org.hibernate.dialect.PostgreSQL9Dialect"/>
        <property name="hibernate.show_sql" value="false"/>
        <property name="hibernate.hbm2ddl.auto" value="validate"/>
        <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false"/>
      </properties>
  </persistence-unit>

  <persistence-unit name="sqlEntityManager">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
      <properties>
        <property name="hibernate.dialect"
                  value="org.hibernate.dialect.SQLServerDialect"/>
        <property name="hibernate.show_sql" value="false"/>
        <property name="hibernate.hbm2ddl.auto" value="validate"/>
        <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false"/>
      </properties>
    </persistence-unit>
</persistence>

21 Kasım 2018 Çarşamba

HQL

Giriş
HQL Query arayüzü tarafından kullanılır. Şöyle yaparız.
String hql = "...";
Query q = session.createQuery(hql);
Foo foo = q.list().get(0);
HQL ve SQL Farkı
Açıklaması şöyle.
HQL queries cannot perform DDL operations.
HQL queries cannot insert single record into table.
An HQL query gives negligible performance degradation because of conversions when compared to SQL.
HQL queries cannot call PL/SQL program.
count
Şöyle yaparız.
"select count(*) from BookDetails b where b.language=:language ");
delete
Bulk delete cascade işlemi yapmaz.
Örnek
Şöyle yaparız.
@Transactional
public void deleteUser(int userId) {
  Query q = session.createQuery("delete User where id = :userId");
  query.setParameter("userId", userId);
  q.executeUpdate();
}
Örnek
Şöyle yaparız.
Session session = ...; 
String queryStr = "delete from SuperParent where name='...'";
Query query = session.createQuery(queryStr);
int noOfRows deleted = query.executeUpdate();
from
Şöyle yaparız.
"FROM Customer";
join kelimesi - inner join
inner kelimesi yazılmayabilir. İki tablonun kesişimini bulur. Şeklen şöyle.
Örnek
Kullanıcı adı admin olan kişinin almadığı eğitimleri göstermek için şöyle yaparız.
 "from Training tr where tr.id not in
 ( select t.id from TrainUser tu
   join tu.training t join tu.user u 
   where u.username = :uname )"
Örnek
Şöyle yaparız.
"FROM CvtermProp cp "
"JOIN db database  ON (database.dbId = cp.value) "
"WHERE cp.typeId=3333 AND cp.cvtermId=1111 ");
join fetch kelimesi
Açıklaması şöyle. Lazy one ilişkilerinde yüklenemsini sağlar.
A "fetch" join allows associations or collections of values to be initialized along with their parent objects using a single select. This is particularly useful in the case of a collection. It effectively overrides the outer join and lazy declarations of the mapping file for associations and collections.
Elimizde şöyle bir kod olsun.
@Entity
public class Customer implements Serializable {


  @ManyToMany(cascade=CascadeType.ALL)
  @JoinTable(name="cheese_customers",
    joinColumns={@JoinColumn(name="CUSTOMER_ID", referencedColumnName = "accountNumber")},
    inverseJoinColumns={@JoinColumn(name="PRODUCT_ID", referencedColumnName="id")})
  private List<Cheese> cheeses = new ArrayList<>();
  ...
}
Şöyle yaparız.
session.createQuery("from Customer C join fetch C.cheeses").list();
insert 
Açıklaması şöyle.
Statement types
Both HQL and JPQL allow SELECT, UPDATE and DELETE statements to be performed. HQL additionally allows INSERT statements, in a form similar to a SQL INSERT FROM SELECT.
left join with - left outer join
outer kelimesi yazılmayabilir. Şeklen şöyle.

Soldaki tablonun tamamını dahil eder, sağdaki kesişimler varsa ekler yoksa null çıktı verir.

Şöyle yaparız.
left join i3.analisys a3 WITH a3.something = :someValue
new map
Sonucu List<Map<...,...>> olarak alabilmeyi sağlar.
Örnek
Şöyle yaparız
Session session = sessionFactory.getCurrentSession();
String HQL_QUERY = "select new map(user.id as id, user.firstName as fullName)
  from User user";        
List<Map<String,String>> usersList = session.createQuery(HQL_QUERY).list(); 
Örnek
Şöyle yaparız.
@Query("select  new Map(u.username as username , p.pname as pname) from Users u join
 u.priviJoin p where u.username = :uname")
List<Users> findByUsername(@Param("uname") String uname);
scalar function
HQL ile veritabanına özel scalar function kullanılabilir.

Örnek
MySQL'deki time_to_sec meodunu kullanmak için şöyle yaparız.
"select count(*) from ProgramGroupEvent as eventLog 
  where eventLog.id= :id and
        time_to_sec(timediff( now() , eventLog.eventDate )) < :seconds"; 
sum
Şöyle yaparız.
@Query(value = "select p.client, sum(p.price) from PizzaOrder p group by p.client")
public List<?> topClients();
where kelimesi
Şöyle yaparız.
"from Inventory where inventoryId='I001'"