|
|
Yayınlandı 9.08.2017 14:26:13
|
|
|

Şimdi diyelim ki kimlik, isim, yaş özellikleri olan bir Öğrenci sınıfı var Dizi hql = "Öğrenci s'den"; Eskiden yaptığımız gibi, genelde yaparız Query query = session.createQuery(hql); Ya da koşullara göre arama yapmak isterseniz. String hql = "Öğrenci s'den 'King%' gibi s.name" Query query = session.createQuery(hql); HQL yerine QBC kullanırsanız, kod şöyledir: Kriterler =session.createCriteria (Student.class); Kriter kriteri = İfade.like("isim","kral%"); Böyle göremiyorum. Sonra arama koşulu 22 yaşına eklenir.
HQL: Dizi hql = "Student s'den 'Wang%' ve s.age= 22 gibi s.name "; Query query = session.createQuery(hql); List list = query.list();
QBC: Kriterler =session.createCriteria (Student.class); Kriter kriter1 = İfade.like("isim","kral%"); Kriter kriter2 = Expression.eq("age",newInteger(22)); criteria.add(kriter 1).add(kriter 2); List list = criteria.list();
Çok daha hantal görünüyor. Ama bir proje yapmış olan herkes bilir ki, bir modülün iş mantığı değiştiğinde genellikle SQL'i yeniden yazmak zorunda kalır ve en sinir bozucu ve sinir bozucu şey başkasının HQL veya SQL'ini almak olur. QBC kullanırsanız, kodun okunabilirliğini ve sürdürülebilirliğini büyük ölçüde artırır. Null değerin değer olduğunu belirtmek önemlidir Örneğin, bir Student nesnesini null isimli bulmak istediğimizde, bunu şöyle yazmalıyız Kriterler =session.createCriteria (Student.class); Kriter kriteri = Expression.isNull("isim"); criteria.add(criterion).list(); ve arada... ve zaman Kriterler =session.createCriteria (Student.class); Kriter kriter1 = Expression.ge("yaş", yeni tam sayı(20)); Alt sınır Kriter kriter2 = İfade.le("yaş", yeni tam sayı(25)); Tavan
//这里也可以把上述两个条件添加到第三个条件里 Kriter kriteri3 =İfade.and(kriter 1,kriter 2); criteria.add(criterion3).list(); Öğrencilerin yaşları 20 ile 25 arasında olan öğrencilere eşdeğerdir Öğrenci s'den eşdeğerdir; burada s.yaş >=20 ve s.yaş <=25
Aşağıda, HQL ve QBC'nin yaygın kullanılan sorgu koşullarının karşılaştırması yer almaktadır HQL QBC anlamına gelen ifade > = Expression.ge() büyüklüğünden büyük veya eşit Greater than > Expression.gt() Küçükse veya eşit < = Expression.le() Less than < Expression.lt() eşit = Expression.eq() eşit değildir <>ya da!= Expression.ne()
Null is null Expression.isNull() is notnull Expression.isNotNull() Belirtilen aralık içinde Expression.between() Belirtilen aralıkta değil, arada değil Expression.not(Expression.between()) Expression.in() Koleksiyonuna Ait Olmak Bir koleksiyonun parçası değil Expression.not(Expression.in()) ve ifade.ve() veya Expression.or() Değil Expression.not() Expression.like gibi bulanık sorgular
1. Bir Kriter örneği oluşturun net.sf.hibernate.Criteria Bu arayüz, belirli bir kalıcılık sınıfı için bir sorguyu temsil eder. Session, Criteria örneğini üretmek için kullanılan fabrikadır.
Kriterler kritik = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List cats = crit.list();
2. Sonuç kümesinin kapsamını daraltın Bir sorgu koşulu (Criterion), net.sf.hibernate.expression.Criterion arayüzünün bir örneğidir. net.sf.hibernate.expression.Expression sınıfı, bazı yerleşik Criterion türlerini almak için tanımlar.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.add( Expression.between("weight", minWeight, maxWeight))
.list(); İfadeler mantıksal olarak gruplanabilir.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.add( Expression.or( Expression.eq( "yaş", yeni Tamsayı(0)), Expression.isNull("yaş"))))
.list();
List cats = sess.createCriteria(Cat.class)
.add( Expression.in( "name",new String[]{"Fritz","Izi","Pk"}))
.add( İfade.ayrıklığı()
.add( Expression.isNull("yaş") )
.add( Expression.eq("age", yeni Tam sayı(0)) )
.add( İfade.eq("yaş", yeni Tam Sayı(1)) )
.add( İfade.eq("yaş", yeni Tam Sayı(2))) ) )
.list(); Birçok önceden hazırlanmış koşul tipi (İfadelerin alt sınıfları) vardır. Özellikle doğrudan SQL'i gömmenizi sağlayan bir yöntem var.
List cats = sess.createCriteria(Cat.class)
.add( Expression.sql("lower($alias.name) like lower(?)", "Fritz%", Hibernate.STRING))
.list(); {alias} bir yer tutucu olduğunda, sorgulanan varlığın satır aliası ile değiştirilir. (Orijinal: {alias} yer tutucusu, sorgulanan varlığın satır takma adıyla değiştirilir.)
3. Sonuçları sıralayın Net.sf.hibernate.expression.Order kullanarak sonuç kümesini sıralayabilirsiniz.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "F%")
.addOrder( Order.asc("name"))
.addOrder( Order.desc("age"))
.setMaxResults(50)
.list();
4. Bağlantılar Bağlantılar arasında createCriteria() kullanarak ilişkili varlıklar arasındaki kısıtlamaları kolayca belirleyebilirsiniz.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "F%")
.createCriteria ("yamaca yavrular")
.add( Expression.like("name","F%")
.list();
İkinci createCriteria() yeni bir Criteria örneğini döndürdüğünü ve kittens koleksiyon sınıfının bir öğesine işaret ettiğini unutmayın. Aşağıdaki alternatif formlar belirli durumlarda faydalıdır.
List cats = sess.createCriteria(Cat.class)
.createAlias("kittens", "kt")
.createAlias("mate", "mt")
.add(Expression.eqProperty("kt.name", "mt.name"))
.list();
(createAlias()) Kriterlerin yeni bir örneğini oluşturmaz. Önceki iki sorguda Cat örneğinin sahip olduğu kittens koleksiyon sınıfının kriterlere göre önceden filtrelenmediğini unutmayın! Sadece kriterlere uygun yavru kedileri iade etmek istiyorsanız, returnMaps() kullanmalısınız.
List cats = sess.createCriteria(Cat.class)
.createCriteria("yamacalar", "kt")
.add( Expression.eq("name", "F%") )
.returnMaps()
.list();
Iterator iter = cats.iterator();
while ( iter.hasNext())
{
Harita haritası = (Harita) iter.next();
Kedi kedi = (Kedi) harita.get(Criteria.ROOT_ALIAS);
Kedi yavrusu = (Kedi) harita.get("kt");
}
5. Dinamik ilişkilendirme Çalışma zamanında FetchMode() ayarlayarak ilişkilendirme nesnelerinin otomatik getirme politikasını değiştirebilirsiniz.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.setFetchMode("mate", FetchMode.EAGER)
.list();
Bu sorgu, hem eş hem yavru yavru kedi dış birleşimle alacak.
6. Örnek sorgular net.sf.hibernate.expression.Example sınıfına göre, belirtilen örnekten sorgu koşulları oluşturabilirsiniz.
Kedi kedi = yeni Cat();
cat.setSex('F');
cat.setColor(Renk.BLACK);
Liste sonuçları = session.createCriteria(Cat.class)
.add( Example.create(cat) )
.list(); Sürüm özellikleri, temsil özellikleri ve çağrışımlar hepsi göz ardı edilir. Varsayılan olarak, null nitelikler de hariç tutulur. Örnekin nasıl uygulandığını ayarlayabilirsiniz. Şunları yapabilirsiniz örneğin nasıl uygulandığını ayarlamak için. Örnek örnek = Example.create(cat) .excludeZeroes() //exclude sıfır değerli özellikler
.excludeProperty("color") //exclude "color" adlı özelliği .ignoreCase() //büyük harf duyarsız dize karşılaştırmaları yapın
.enableLike(); Dize karşılaştırmaları için like kullanın
Liste sonuçları = session.createCriteria(Cat.class)
.add(örnek)
.list(); Hatta ilgili nesneler için kriterler belirlemek için örnekler bile kullanabilirsiniz. Liste sonuçları = session.createCriteria(Cat.class) .add(Example.create(cat))
.createCriteria("mate") .add(Example.create(cat.getMate())) .list();
Referans kodu şöyledir:
|
Önceki:LINQ sol, sağ ve iç bağlantılarÖnümüzdeki:js'deki let ve var tanım değişkenleri arasındaki fark
|