java تاريخ - معايير السبات:ربط الجدول بدون اقتران معين




اسماء واين (5)

Criterion ownerCriterion = Restrictions.sqlRestriction(SELECT ownerId FROM   Owner WHERE ownerName ='bob');
Criteria criteria = getSession().createCriteria(Pet.class);
criteria.createCriteria("ownerId").add(ownerCriterion);

أود استخدام معايير api في Hibernate لصياغة استعلام معين ينضم إلى كيانين. لنفترض أن لدي كيانين ، هما Pet و Owner مع مالك يمتلك العديد من الحيوانات الأليفة ، ولكن لا يتم تعيين هذا الارتباط في التعليقات التوضيحية Java أو xml.

مع hql ، يمكنني تحديد المالكين الذين لديهم حيوان أليف يسمى "fido" عن طريق تحديد الانضمام في الاستعلام (بدلاً من إضافة مجموعة من الحيوانات الأليفة إلى فئة المالك).

هل يمكن فعل الشيء نفسه باستخدام معايير السبات؟ إذا كيف ذلك؟

شكرا ، ياء


ما أفهمه هو أنك إذا قمت بذلك باستخدام HQL ، فأنت تقوم بإنشاء ارتباط ديكارت مع فلتر بدلاً من صلة داخلية. لا تدعم استعلامات المعايير إجراء ذلك.


هناك SQLCriterion ، والتي يمكنك إعطاء SQL التعسفي ، وإضافة إلى Criteria الخاصة بك. في سلسلة SQL ، سيتم استبدال الرمز المميز {alias} "باسم مستعار للكيان الرئيسي."


في NHibernate ، يمكنك استخدام الاستعلامات الفرعية التي يتم تعريفها على أنها DetachedCriteria. لست متأكدا مما إذا كان يعمل نفس الشيء في Java ، على الأرجح هو نفسه:

DetachedCriteria pets = DetachedCriteria.For<Pet>("pet")
  .SetProjection(Projections.Property("pet.ownername"))
  .Add(/* some filters */ );

session.CreateCriteria(typeof(Owner))
  .Add(Subqueries.PropertyIn("name", pets);

يفترض أنه تم ضمه باستخدام اسم المالك.


أصلحت مشكلتي بإضافة التعليق التوضيحي لـLob والذي سيخلق البايت [] في oracle كـ blob ، لكن هذا التعليق سيخلق الحقل كمواد خام لا تعمل بشكل صحيح ، لجعل البايت [] الذي تم إنشاؤه كـ bytea قد جعلت من الزبون لهجة postgres على النحو التالي

Public class PostgreSQLDialectCustom extends PostgreSQL82Dialect {
    public PostgreSQLDialectCustom() {
        System.out.println("Init PostgreSQLDialectCustom");
        registerColumnType( Types.BLOB, "bytea" );

      }

    @Override
    public SqlTypeDescriptor remapSqlTypeDescriptor(SqlTypeDescriptor sqlTypeDescriptor) {
    if (sqlTypeDescriptor.getSqlType() == java.sql.Types.BLOB) {
      return BinaryTypeDescriptor.INSTANCE;
    }
    return super.remapSqlTypeDescriptor(sqlTypeDescriptor);
  }
 }

تحتاج أيضا إلى تجاوز المعلمة لللهجة

spring.jpa.properties.hibernate.dialect = com.ntg.common.DBCompatibilityHelper.PostgreSQLDialectCustom

يمكن العثور على مزيد من التلميح لها: https://dzone.com/articles/postgres-and-oracle





java hibernate hql criteria