Критерии Добавьте все таблицы из класса сущностей, когда нужна только его часть.

когда я создаю запрос на подсчет с помощью hibernate-Criteria-добавляю всю возможную таблицу из класса сущностей как левое соединение, что является плохой производительностью.

Организация :

@Entity
@Table(name = "employees")
Public Class Employees {

    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "lz_job_stat_id")
    private Integer id;

    @ManyToOne
    @JoinColumn(name = "departments_id")
    private Departments  departments;


    @ManyToOne
    @JoinColumn(name = "managers_id")
    private Managers  managers;

}

И критерии:

public class EmployeeDao {

    public List<EmpDao> findIt(){
        .....
        Criteria crit = createEntityCriteria().setFetchMode("departments", FetchMode.SELECT);
        crit.add(Restrictions.eq("managers.deleted", false));

        crit.setProjection(Projections.count("id"));
        return crit.list();
    }
}

И произведенный SQL:

select count() as y0_ 
from employees this_ 
left outer join departments department3_ 
    on this_.department_id=department3_.department_id
left outer join managers manager2_ 
    on this_.manager_id=manager2_.manager_id

теперь, когда я пробую crit.list - он создает левое соединение для всех возможных таблиц.

когда не предполагается создавать объединение для всех из них. Разве Критерии недостаточно умны, чтобы знать, что мне не нужны эти таблицы? только тот, который я использую "WHERE CLAUSE", есть ли способ явно указать критерию "НЕ ПРИСОЕДИНЯЙТЕСЬ К ЭТИМ ТАБЛИЦАМ !!!" без SQL


person 2Big2BeSmall    schedule 13.06.2016    source источник
comment
Спящий режим: /* критерий запроса / выберите количество () как y0_ от сотрудников this_ левое внешнее объединение отделов Department3_ на this_.department_id=department3_.department_id левое внешнее объединение менеджеров manager2_ на this_.manager_id=manager2_.manager_id   -  person 2Big2BeSmall    schedule 13.06.2016
comment
Почему мы не видим ограничение на manager.deleted = false ? Вы уверены, что это запрос, созданный по этому критерию?   -  person Thierry    schedule 13.06.2016
comment
На копипаст его не хватило.   -  person 2Big2BeSmall    schedule 13.06.2016


Ответы (1)


Укажите тип выборки в аннотации ManyToOne:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "departments_id")
private Departments  departments;

или ИМХО предпочтительнее в критериях:

criteria.setFetchMode("departments", FetchMode.SELECT)
person Sergii Lagutin    schedule 13.06.2016
comment
в этом случае его следует использовать для отделов, а не для менеджеров, потому что есть ограничение для менеджеров, но не для отдела, что является неожиданным внешним соединением, которое получает @Francy. - person Thierry; 13.06.2016
comment
Я пробовал .setFetchMode, и я продолжаю получать левое внешнее соединение для других объектов. - person 2Big2BeSmall; 13.06.2016
comment
Обновлено, есть ли функция Don't-Fetch, предотвращающая объединение всех возможных объектов таблицы? - person 2Big2BeSmall; 13.06.2016
comment
LAZY устарел и теперь работает как select : @Deprecated public static final FetchMode LAZY = SELECT; - person 2Big2BeSmall; 13.06.2016
comment
@Francy Если у вас есть условие в таблице менеджеров, вы должны включить его в предложение присоединения. - person Sergii Lagutin; 13.06.2016