Когда использовать проекции Hibernate? - PullRequest
40 голосов
/ 21 сентября 2011

Я немного запутался в проекциях Hibernate и критериях . Когда использовать прогнозы и когда использовать критерии?

Пожалуйста, помогите мне. Спасибо!

Ответы [ 3 ]

82 голосов
/ 21 сентября 2011

Они не являются взаимоисключающими, вы можете использовать оба одновременно. Прогнозы обычно используются в контексте некоторых критериев.

Проще говоря, Hibernate Projection используются для запроса только подмножества атрибутов объекта или группы объектов, которые вы запрашиваете с помощью критериев. Вы также можете использовать проекции для указания distinct предложений и агрегатных функций, таких как max, sum и так далее. Это все равно что ссылаться на , какие данные вы выбираете. Как изменение предложения select в запросе SQL.

Критерии гибернации используются для определения условий, которым должны соответствовать данные для выбора. Это похоже на , как - это данные, которые вы получаете. Как модификация предложений from и where SQL-запроса.

Обратите внимание, что это как и , что не совсем верно, это просто ориентация, направленная на помощь ОП. Например, вы можете изменить , какие данные вы извлекаете с помощью createCriteria(String associationPath).

Я бы посоветовал взглянуть на эту статью. Hibernate: Критерии запросов по глубине

2 голосов
/ 10 февраля 2018

Проекции используются для выполнения агрегатных операций и для получения запроса в один столбец. С Ограничениями мы можем получить доступ к ROW , но с ПРОЕКЦИЯМИ мы можем получить доступ к целому КОЛОННА

EX -

public static void main(String[] args) {
    SessionFactory factory = new Configuration().configure().addAnnotatedClass(Student.class).buildSessionFactory();
    Session session = factory.getCurrentSession();
    try {
        session.beginTransaction();
        Criteria c = session.createCriteria(Student.class);
        Projection p = Projections.property("lastName");
        List<String> students = c.setProjection(p).list();
        for(String s:students)
            System.out.println(s);
        session.getTransaction().commit();
        session.close();
    } finally {
        factory.close();
    }
}

В вышеприведенном примере я использовал вызов projection, чтобы ДОБАВИТЬ свойство проекции «name» в критерии.Возвращает Винчестер Винчестер Винчестер Винчестер, который является фамилией COLUMN в таблице.

Выход =

Hibernate: выберите this_.last_name как y0_ от студента this_винчестер винчестер винчестер винчестер

Примечание - Мы можем добавить только одну проекцию, если мы добавим более 1 проекции, предыдущая будет переопределена.если вы хотите добавить более одного прогноза, вам понадобится класс ProjectionList

Orignal Table -

enter image description here

0 голосов
/ 22 ноября 2013

Projection - это интерфейс, предоставленный в пакете «org.hibernate.criterion», Projection - это класс, предоставленный в том же пакете, фактически Projection - это интерфейс, а Projection - это класс и фабрика для создания объектов проекции.

В классе Projection у нас есть все статические методы, и каждый метод этого класса возвращает объект интерфейса Projection.

Если мы хотим добавить объект Projection в Criteria, тогда нам нужно вызвать метод setProjection ()

Помните, что при добавлении объекта проекции к критериям можно добавлять по одному объекту за раз. Это означает, что если мы добавим 2-й проекционный объект, то этот 2-й будет переопределять первый (первый не будет работать), поэтому за один раз мы можем только один проекционный объект к критерию

Используя критерии, если мы хотим загрузить частичный объект из базы данных, то нам нужно создать объект проекции для свойства, которое должно быть загружено из базы данных

Criteria crit = session.createCriteria(Products.class);
crit.setProjection(Projections.proparty("proName"));
List l=crit.list();
Iterator it=l.iterator();
while(it.hasNext())
{
    String s = (String)it.next();
    // ---- print -----
}

Если мы добавим несколько критериев к критериям, то последний добавленный прогноз будет считаться выполненным, см. *

Criteria crit = session.createCriteria(Products.class);

Projection p1 = Projection.property("proName");
Projection p2 = Projection.property("price");

crit.setProjection(p1):
crit.setProjection(p2):
List l=crit.list();
...