Your SlideShare is downloading. ×
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
AnkaraJUG Nisan 2013 - Java Persistance API
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

AnkaraJUG Nisan 2013 - Java Persistance API

489

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
489
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
19
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 1: @ertugrulaslan: ertugrulaslan.blogspot.com: /ertugrulaslanMail: ertugrul@devinim.com.tr
  • 2. 2Agenda ORM (Object Relational Mapping) teknolojisi JPA (Java Persistence API) JPA’mı Hibernate’mi kullanmalıyız.? Persistence.xml Entity ve annotasyonlar EntityManager Relatationships JPQL (JPA sorgulama dili) JPA concurrency Java EE 7 ve JPA 2.1 ile gelecek yeni özellikler Demo uygulama
  • 3. 3OBJECT RELATION MAPPING (ORM)public class Person {private String adı;private String soyadı;private String yaşı;private String telefon;//getter and setter}• Objelerin tablolarda kalıcı hale getirilmeleri için uygulamadakiclassların veritabanındaki tablolara, classlarda tanımlanan objeözelliklerinin yani obje değişkenlerinin bu tablolardaki sütunlarlaeşleştirilmesi ORM (Object-Relational Mapping) denir.
  • 4. 4ORM teknolojilerine neden ihyiyaç duyuldu.? Object-oriented dil kullanan programcılar, objelerini yineobject-oriented bir veritabanı sisteminde tutmakistiyorlar. Yazılımda çalışma zamanında üretilen nesnelerintaşıdıkları bilgilerin daha sonra kullanılmak üzere kalıcı halegetirilmesinin en tabii yöntemi, olsa olsa bir object-oriented veri tabanı yönetim sistemi kullanmaktır. Fakat şuan veriyi kalıcı kılmanın en tabii yolu olarakilişkisel veri tabanı yönetim sistemleri (Relational DatabaseManagement Systems, RDBMS)
  • 5. 5ORM teknolojilerine neden ihyiyaç duyuldu.? Ve bunu basarabilmek icin, aşağıdaki yöntemkullanılmaktaydı. ResultSet’den dönen sonucuları objeye map etme vs.
  • 6. 6ORM teknolojilerine neden ihyiyaç duyuldu.? Bu şekilde uygulama geliştiren programcılar, zamanzaman tabloların yapısının değişmesiyle kodlarında tekrartekrar düzeltme yapmak zorunda kaldı ve uygulamalarbüyüdükçe bu katlanılamaz bir durum olmaya başladı. Peki ne yapılmalı.?
  • 7. 7ORM teknolojilerine neden ihyiyaç duyuldu.? Bu uyumsuzluğun önüne geçmek için, RDBMS önüne konulacak birkatmanla, RDBMS in Object-oriented db’ye dönüştürülmesidir. YaniRDBMS ile uygulama arasına konulacak böyle bir katmanın iki arayüzüolacaktır: Birisi SQL(JDBC)’ı kullanarak RDBMS ilehaberleşen interface, diğeri ise bir API üzerinden objelerle alakalıCRUD(Create, Read, Update,Delete) işlemlerini yapmaya izinveren interface. Dolayısıyla bu katman, programcıları, arkadakiRDBMS’in ilişikisel yapısından uzak tutacak ve onlara, objeleri sanki birObject-oriented veritabanında kalıcı hale getiriyormuş gibi programyazma imkanı sağlayacaktır.
  • 8. 8JPA’dan önce J2EE’nin ilk sürümü olan Aralık 1999 tarihli ilk versiyonunda EJB (EnterpriseJavaBean)’nin iki türünden birisi olan entity bean, bir ORM aracı idi ve Java ile geliştirilenuygulamaların veri katmanını halledecek şekilde geliştirilmişti. Büyük umutlarla beklenenEJB’ler ve özellikle de Entity beanler kısa sürede hayal kırıklığı yarattı. Aynı zamanda birer uzak/dağıtık obje olan EJB’ler, gerek işin doğasının zaten çok zorolması gerek ise aşırı akademik yaklaşımdan dolayı kullanıcılarına öğrenme, uygulama veözellikle de çalışma zamanındaki performans ve ölçeklenirlik açısından ciddi sıkıntılaryaşattı. Sun EJB 2.0’ı yayınlayıp, özellikle performans ve ölçeklenirlik konusunda belliilerlemeler sağladıysa da entity beanlere olan güvenin azalmış olması gerek Javaprogramcılarını veri katmanınında kullanacakları ORM aracı konusunda alternatifleraramaya itti.
  • 9. 9JPA(Java Persistence API)’nın doğuşu
  • 10. 10JPA(Java Persistence API)’nın doğuşu Hibernate, TopLink vs. çok başarılıydı fakat, farklı API’lere sahiplerdi. Bu yüzden bu çözümler birbirlerinin yerine geçebilir durumda değillerdi. Bu konuda bu kadar çok kütüphane çıktıktan sonra ortada bir karmaşa oluştu. Ve Java dünyasında her konuda olduğu gibi bu konuda da üretilen buncakütüphanenin ortak ve iyi yönleri toplanmış ve bir standart belirlenmiştir. İştebu spesifikasyon Java Persistence API (JPA).
  • 11. 11JPA(Java Persistence API)’nın doğuşu Ana teması daha kolay geliştirme ve programcılara çok büyük kolaylıkve yenilikler getiren Java EE 5’in içindeki EJB 3.0’ın bir parçası olarak2006 yılında ilk versiyon olan JPA 1.0 yayınlandı. EJB 3.0 ile birlikte tanıtılan bu spesifikasyon java dünyasında büyükbir ilgi karşılandı. Hibernate ve TopLink, JPA uyumlu ürünlerini piyasaya çıkardılar. Vehem JPA hem de kendi özel (native) API’leri üzerinden programlamayapılabildiler. Bu durum specifikasyon tabanlı ilerleyen java’nın yapısına çok dahauygundu ve Java programcıları artık standart bir API üzerinden pek çokfarklı ORM ürününü kullanabilir hale gelmişlerdi. 2009’un sonrlarındayayınlanan Java EE 6. sürümünün bir parçası olarak yayınlanan JPA 2.0sürümü, 1.0 sürümüne yaptığı eklerle JPA’yi çok daha güçlü hale getirdi.
  • 12. 12JPA’mı Hibernate’mi kullanılmalı JPA, Java EE ve ORM dünyasındaki karmaşalar sonucunda ortayaçıkmış bir persistence API’dir. JPA, bir spesifikasyondur. Implementasyon değil. JPA, kullanabilmek için bir implementasyona ihtiyaç vardır. Bu implementasyonlarda, Hibernate, Toplink, EcpliseLink vs. Birer JPAimplementasyonudur.HibernateJPA
  • 13. 13JPA(Java Persistence API) faydaları - I Öğrenimi ve kullanımı çok kolaydır. Java SE hem de Java EE ortamlarında rahatlıklakullanılabilmektedir. Objeler arasında OneToMany, OneToOne ve ManyTo Many ilişkileryanında inheritance ve polymorphism gibi özellikleri de destekler. Konfigurasyon bilgileri ister XML’de istersek Java anotation’ları ileyapma imkanı verir. Default değerle çalışabilir. LazyFetching Cascade Operations: Bir objeyi silince ona bağlı diğer objelerindesilinmesi veya güncellenmesi
  • 14. 14JPA(Java Persistence API) faydaları - II Callbacks, veritabanlarındaki triggerlara benzetebiliriz.@PrePersist, @PostRemove NamedQueries, Sorgumuzu oluşturup bir isim veriyoruz vesorgumuzu istenilen yerde bu isimle çağırıyoruz.PreparedStatementlera benzetebiliriz. Native SQL, JPQL’in dışında kendi kendi SQL’lerimizi yazma imkanıverir. Büyük uygulamalarda yazmak zorunda kalabiliyoruz.
  • 15. 15Persistence.xml JPA kullanmak için gerekli olan .xml dosyasıÖrnek bir persistence.xml dosyası
  • 16. 16Persistence.xml Unit name Transaction type, JTA veya RESOURCE_LOCAL
  • 17. 17Persistence.xmlKullanılan JPA provider
  • 18. 18Persistence.xml
  • 19. 19Persistence.xml İmplementasyona bağlı propertyler olabililir.
  • 20. 20Persistence.xml İmplementasyona bağlı propertyler olabililir.
  • 21. 21Entity Entity; JPA’yı kullanarak veritabanında kalıcı olacak objeye denir. Bir objenin entity olması için o objenin kendisindenüretileceği classın @Entity annotasyonuyla ifade edilmesi yeterlidir. Seralizable olması dikkat etmeliyiz, katmanlar arası geçişte kullanıyorolabiliriz.
  • 22. 22Entity - II
  • 23. 23@ Annotationlar@Id@GeneratedValue(strategy = GenerationType.AUTO)private Long id;@Column(name = "MAIL", unique = true, length = 80, nullable = false)private Long id;@Transient; veritabanında kalıcı olmasını istemediğimiz değişkenler(property) için kullanırız.@Transientprivate String surname;Not: javax.persistence paketinden import ediyoruz.
  • 24. 24@ Annotationlar - II@Embeddedprivate Address address;
  • 25. 25@ Annotationlar - III @Enumuratedpublic enum PhoneType {MOBILE,HOME,WORK}@Entity@Table(name="PERSONS")public class Person implements Serializable {@Id@GeneratedValue(strategy = GenerationType.AUTO)private Long id;@Enumerated(EnumType.STRING)private PhoneType phoneType;
  • 26. 26EntityManager EntityManager; Entity class’larımız üzerinde CRUD(CREATE,READ,UPDATE,DELETE) işlemlerini yapmak için kullanılanbir interface’dir. Uygulama sunucusu kullanılıp kullanılmadığımıza bağlı olarak,EntityManager interface’ine ulaşmak için değişik yöntemlerkullanılmalıdır. EntityManagerFactory, tek objeli (singleton) bir interface olup,üzerinde entitylerle ilgili CRUD(create, read, update, delete)metodlarını çağıracağımız EntityManager nesnelerinin fabrikasıdır(factory).
  • 27. 27EntityManager - II @PersistenceContextEntityManager em;* Bu kullanımda uygulama sunucusu tarafından EntityManagerobjesinin inject edilmesini sağlıyoruz. @PersistenceUnit(unitName="ankaraJugPU")EntityManagerFactory emf;EntityManager em = emf.createEntityManager(); EntityManagerFactory emf =Persistence.createEntityManagerFactory("ankaraJugPU");EntityManager em = emf.createEntityManager();* Bu kullanım ise uygulama sunucusu olmayan(uygulama sunucusu olanortamlarda olabilir) desktop uygulamalarında kullanılan yöntemdir.
  • 28. 28EntityManager - IIIPersistence Context and EntityManagerPersistenceContextEntityManagerpersist()remove()refresh()merge()find()createQuery()createNativeQuery()createNamedQuery()contains()flush()JavaBeanServlet
  • 29. 29EntityManager - IV
  • 30. 30EntityTransaction JPA, veri üzerinde CUD yapan işlemler için mutlaka bir transactionbeklemektedir. Sizin DataSource beanı üzerinde veya hibernate.cfg.xml içerisindeautocommit davranışını true yapmanızın bir etkisi olmamaktadır. Transaction kullanılmasajavax.persistence.TransactionRequiredException hatası anlınacaktır. EJB kullanıyorsa, ejb metodları default olarak transactional olarakçalışmaktadır.
  • 31. 31EntityTransaction EJB metodu içerisinde aşağıdaki gibi kullanılabilinir.
  • 32. 32Relationships@OneToOne @OneToMany@ManyToOne @ManyToManyBidirectional ve Undirectional
  • 33. 33Relationships -IIpublic class Order {int id;...Customer cust;}public class Customer {int id;...Set<Order> orders;}@Entity @Entity@ManyToOne@OneToMany(mappedBy=“cust”)@Id @IdCUSTOMERID . . .ORDERCUST_IDID. ..1 n OneToMany Bidirectional
  • 34. 34Relationships -III ManyToOnepublic class Customer {int id;Address addr;}CUSTOMERADDR_IDIDADDRESS. . .ID@Entity@ManyToOne@IdADDR_ID
  • 35. 35Relationships -III ManyToManypublic class Customer {int id;...Collection<Phone> phones;}PHONES_IDCUSTS_ID@Entity @Entity(access=FIELD)@Id @Id@ManyToMany @ManyToMany(mappedBy=“phones”)public class Phone {int id;...Collection<Customer> custs;}CUSTOMERID . . .PHONEID. ..CUSTOMER_PHONEID@Entity
  • 36. 36Relationships -IV ManyToManyPHONES_IDCUST_IDCUSTOMERID . . .PHONEID. ..CUST_PHONE@Entitypublic class Customer {...@ManyToMany@JoinTable(table=@Table(name=“CUST_PHONE”),joinColumns=@JoinColumn(name=“CUST_ID”),inverseJoinColumns=@JoinColumn(name=“PHONES_ID”))Collection<Phone> phones;}İlişkinin sahibi
  • 37. 37Relationships -IV ManyToManyPHONES_IDCUST_IDCUSTOMERID . . .PHONEID. ..CUST_PHONE@Entitypublic class Customer {...@ManyToMany@JoinTable(table=@Table(name=“CUST_PHONE”),joinColumns=@JoinColumn(name=“CUST_ID”),inverseJoinColumns=@JoinColumn(name=“PHONES_ID”))Collection<Phone> phones;}İlişkinin sahibi
  • 38. 38Relationships -VCascading Persist@Entitypublic class Student implements Serializable {@Id@GeneratedValueprivate Long id;private String name;@OneToOne(cascade = CascadeType.PERSIST)private Address address
  • 39. 39@Entitypublic class Student implements Serializable {@Id@GeneratedValueprivate Long id;private String name;@OneToOne(cascade = {PERSIST, REMOVE})private Address address;Tip TanımPERSIST Nesne persist edilirse alt nesne de persist edilirMERGE Nesne merge edilirse alt nesne de merge edilirREMOVE Nesne silinirse bağlı alt nesne de silinirREFRESH Nesne yenilenirse bağlı alt nesne de yenilenirALL Tüm işlemler birlikte yapılır
  • 40. 40Queries(Sorgular) – JPQL JPQL (Java Persistence Query Language) Named, Dynamic, Native QueriesSELECT e FROM Employee eSELECT e FROM Employee e WHERE e.name=„ali‟;SELECT e FROM Employee e WHERE e.name=„ali‟ ande.email=„abc@tt.com‟;em.createQuery("SELECT e FROM Employee e").getResultList();em.createQuery("SELECT e FROM Employee e WHEREe.name=„ali‟").getResultList();em.createQuery("SELECT e FROM Employee e WHERE e.name=:name").setParameter("name", name).getResultList();
  • 41. 41Queries(Sorgular) – JPQL JPQL;List<Person> persons = em.createQuery("SELECT e FROM Persone").getResultList(); Native SQL;List<Person> persons2 = em.createNativeQuery("SELECT * FROMPersons").getResultList(); JOINSSELECT e.name, d.name FROM Employee e JOIN e.department dWHERE e.status = „Tam zamanlı‟SELECT DISTINCT o FROM Order o JOIN o.lineItems l JOINl.product p WHERE p.productType = „shoes‟
  • 42. 42Queries(Sorgular) – JPQLQuery query = em.createQuery("SELECT p FROM Person p "+ "WHERE p.name LIKE :name");query.setParameter(“name", adı);query.setFirstResult(5);query.setMaxResults(10);List<Person> list = query.getResultList(); Dikkat !Person pr = (Person) em.createQuery("SELECT p FROM Person pWHERE p.email=:").setParameter("email“,mail).getSingleResult();- Birden fazla kayıt dönerse hata alınır.
  • 43. 43Queries(Sorgular) – JPQL Named QueriesList<Person> list = em.createNamedQuery("Person.findAll").getResultList();Query query = em.createNamedQuery("Person.findByEmail");query.setParameter(“mail", mail);List<Person> list = query.getResultList();Kullanımı
  • 44. 44Queries(Sorgular) – JPQL Criteria QuerySELECT c FROM Country cCriteriaBuilder cb = em.getCriteriaBuilder();CriteriaQuery<Person> q = cb.createQuery(Person.class);Root<Person> c = q.from(Person.class);q.select(c);TypedQuery<Person> query = em.createQuery(q);List<Person> results = query.getResultList();
  • 45. 45JPA 2.0 Concurrency and lockingtx1.begin();//employee id 5e1 = findEmp(5);e1.setSalary(4000);tx1.commit();//e1.version == 2 in dbtx2.begin();//employee id 5e1 = findEmp(5);e1.setSalary(5000);tx2.commit();//OptimisticLockExceptionZaman Peki bu durumda sonuç ne olacak.?Transaction Locking; Locking mekanizması entity objeleri üzerinde yapılanokuma ve yazma işlemlerine farklı kilit türlerinin konmasını tanımlayanmekanizmadır.
  • 46. 46JPA 2.0 Concurrency and locking READ(JPA 1.0) || OPTIMISTIC (JPA 2.0)Entity objeleri üzeride okuma kilidi. Kilitleme mekanizmalarında genel olarak o anda biryazma işlemi yapılmıyorsa, aynı anda yapılan birden fazla eşzamanlı okuma işlemine izin verilir WRITE (JPA 1.0) || OPTIMISTIC_FORCE_INCREMENT (JPA 2.0)Entity objeleri üzeride yazma kilidi. Eğer bir entity nesnesi üzerinde eşzamanlı olarakveri değişikliği yapılmak isteniyorsa bu işleme müdahale edilmez, amageliştiriciye OptimisticLockingException istisnası fırlatılarak bilgilendirme yapılır.Veritabanı seviyesinde kilit uygulanmaz
  • 47. 47JPA 2.0 Concurrency and locking PESSIMISTIC_WRITEEntity objesi üzerinde işlem yapılırken o anki yazma ya da okuma işlemi haricindeki tüm diğerokuma ve yazma işlemleri o işlem tamamlanana kadar askıya alınırlar. PESSIMISTIC_READBu kilit mekanizması okuma işlemlerine kilit koyarken veritabanı seviyesinde kilit uygulanır.PESSIMISTIC_READ uygulanan bir entity nesnesi üzerinde eşzamanlı yapılan okuma işlemlerinemüdahale edilmez. Okuma anında yapılmak istenen yazma işlemleri ise okuma işlemitamamlanana kadar askıya alınır. Bu sayede karışıklıkta giderilmiş olur. PESSIMISTIC_FORCE_INCREMENTVersiyonlama özelliğiyle entity nesnesi üzerinde yapılan her bir değişiklik, entity nesnesinin@Version annotasyonu ile (@Version Long vers) +1 değer arttırımına neden olur. Bu sayede herbir veri değişikliği versiyonlanmış olur. Çalışma anında bellek alanında bir entity nesnesininbirden fazla yönetimli karşılığı olabilir, versiyonlama sistemiyle en yüksek değerlikli versiyondeğerine sahip entity nesnesi diğer eski versiyonlarına göre tercih edilmelidir, çünkü en günceliodur.
  • 48. 48JPA 2.0 Concurrency and locking Örnek kullanımlarem.lock(person, LockModeType.PESSIMISTIC_FORCE_INCREMENT);em.find(Person.class, 10L, LockModeType.READ);em.refresh(person, LockModeType.PESSIMISTIC_READ);
  • 49. 49JPA 2.1 New features Stored procedures ve function desteği Update ve Delete Critieria queries desteği Schema generation desteği CDI injection into listeners
  • 50. 50JPA 2.1 New features@Entity@NamedStoredProcedureQuery(name="topGiftsStoredProcedure", procedureName="Top10Gifts")StoredProcedreQuery query =EntityManager.createNamedStoredProcedureQuery("topGiftsStoredProcedure");query.registerStoredProcedureParameter(1,String.class, ParameterMode.INOUT);query.setParameter(1, "top10");query.registerStoredProcedureParameter(2, Integer.class, ParameterMode.IN);query.setParameter(2, 100);query.execute();String response = query.getOutputParameterValue(1);
  • 51. 51JPA 2.1 New featuresSELECT c FROM Customer c WHEREFUNCTION(„hasGoodCredit‟, c.balance, c.creditLimit)
  • 52. 52JPA 2.1 New featuresCriteriaUpdate<Customer> q =cb.createCriteriaUpdate(Customer.class);Root<Customer> c = q.from(Customer.class);q.set(c.get(Customer_.status), "outstanding").where(cb.lt(c.get(Customer_.balance), 10000)); update/delete using CriteriaCriteriaDelete<Customer> q =cb.createCriteriaDelete(Customer.class);Root<Customer> c = q.from(Customer.class);q.where(cb.equal(c.get(Customer_.status), "inactive"),cb.isEmpty(c.get(Customer_.orders)));
  • 53. 53JPA 2.1 New featuresCriteriaUpdate<Customer> q =cb.createCriteriaUpdate(Customer.class);Root<Customer> c = q.from(Customer.class);q.set(c.get(Customer_.status), "outstanding").where(cb.lt(c.get(Customer_.balance), 10000)); update/delete using CriteriaCriteriaDelete<Customer> q =cb.createCriteriaDelete(Customer.class);Root<Customer> c = q.from(Customer.class);q.where(cb.equal(c.get(Customer_.status), "inactive"),cb.isEmpty(c.get(Customer_.orders)));
  • 54. 54
  • 55. 55

×