6 Haziran 2018 Çarşamba

JPA @StaticMetamodel Anotasyonu

Giriş
Şu satırı dahil ederiz.
import javax.persistence.metamodel.ListAttribute;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;
Açıklaması şöyle.
The static metamodel is useful for creating type-safe queries with the JPA's Criteria API.
Metamodel sınıfının ismi gerçek sınıf ismi + "_" karakteridir. Örneğin Foo_ gibidir.

Metamodel içinde ListAttribute, SingularAttribute tipinden alanlar olur.

SingularAttribute alan için ilk parametre gerçek sınıf ismi, ikinci parametre alan tipidir.

Örnek
Şöyle yaparız.
package Entities;

import javax.annotation.Generated;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;

@Generated(value="EclipseLink-2.5.2.v20140319-rNA", date="2018-03-20T16:09:40")
@StaticMetamodel(Item.class)
public class Item_ { 

  public static volatile SingularAttribute<Item, Long> item_id;
  public static volatile SingularAttribute<Item, Long> b_id;
  public static volatile SingularAttribute<Item, Double> item_price;
  public static volatile SingularAttribute<Item, String> description;
  public static volatile SingularAttribute<Item, String> item_name;
  public static volatile SingularAttribute<Item, String> manufacturer;

}
Aynı şeyin Order için de yapıldığını varsayalım. Şöyle yaparız. Order_ ve Item_ sınıfları StaticMetamodel ile tanımlıdır.
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Order> cq = cb.createQuery(Order.class);
SetJoin<Order, Item> itemNode = cq.from(Order.class).join(Order_.items);
cq.where(cb.equal(itemNode.get(Item_.id), 5)).distinct(true);
Örnek
Elimizde şöyle bir kod olsun.
@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(ReadModel.class)
public abstract class ReadModel_  {

  public static volatile SingularAttribute<ReadModel, Time> time;
  public static volatile SingularAttribute<ReadModel, BigInteger> customerId;
  public static volatile SingularAttribute<ReadModel, BigInteger> deviceId;
  public static volatile SingularAttribute<ReadModel, Timestamp> deviceTime;
  public static volatile SingularAttribute<ReadModel, Date> date;
} 
Elimizde şöyle bir kod olsun.
@StaticMetamodel(DeviceData.class)
public abstract class DeviceData_ extends ReadModel_ {
  public DeviceData_() {
  }
}
Şöyle yaparız.
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<DeviceData> cq = cb.createQuery(DeviceData.class);
Root<DeviceData> root = cq.from(DeviceData.class);
List<Predicate> conditions = new ArrayList<>();
conditions.add(cb.isTrue(root.get(deviceId).in(...)));
conditions.add(cb.greaterThanOrEqualTo(root.get(devicetime), ...));

cq.where(conditions.toArray(new Predicate[]{})).orderBy(cb.asc(root.get(devicetime)));
Query query= session.createQuery(cq);

Hiç yorum yok:

Yorum Gönder