0

Я пытаюсь получить сущность с использованием API критериев.Спящий режим: не извлекайте ассоциацию в критерии APi

Вот что заголовок выглядит как объект

public class Header{ 
    @OneToMany(mappedBy = "header", cascade = CascadeType.ALL) 
    @LazyCollection(LazyCollectionOption.FALSE) 
    @JsonManagedReference 
    private List<Item> items; 
} 

Могу ли я ограничить, чтобы не загружать элементы? Я попробовал это. Пожалуйста, помогите

Criteria criteria = session.createCriteria(Header.class); 
criteria.add(Restrictions.eq("id", id)); 
criteria.setFetchMode("header.items",FetchMode.LAZY); 
return (Header) criteria.uniqueResult(); 

вошли в MySQL запросов он выглядит как

/* MyService Health Check */ SELECT 1 
     3 Query /* criteria query */ select this_.id as id1_0_0_, this_.created_at as created_2_0_0_, this_.updated_at as updated_3_0_0_, this_.created_by as created_4_0_0_, this_.description as descript5_0_0_, this_.due_date as due_date6_0_0_, this_.party_id_from as party_id7_0_0_, this_.party_id_to as party_id8_0_0_, this_.reference_id as referenc9_0_0_, this_.sub_type as sub_typ10_0_0_, this_.total_amount_with_tax as total_a11_0_0_, this_.total_amount_without_tax as total_a12_0_0_, this_.type as type13_0_0_ from headers this_ where this_.id=1 
     3 Query SHOW WARNINGS 
     3 Query select items0_.header_id as header_i7_0_0_, items0_.id as id1_2_0_, items0_.id as id1_2_1_, items0_.created_at as created_2_2_1_, items0_.updated_at as updated_3_2_1_, items0_.amount as amount4_2_1_, items0_.header_id as header_i7_2_1_, items0_.ignore_reco as ignore_r5_2_1_, items0_.type as type6_2_1_ from items items0_ where items0_.header_id=1 
+0

Откуда вы знаете, что предметы загружены? Есть ли что-то в журнале запросов или ваша проблема, что вы можете получить к ним доступ позже? Или вы хотите сериализовать его, и его не следует добавлять в этом случае? –

+0

Я положил отладчик на последней строке 'return (Header) criteria.uniqueResult();'. В возвращаемом ответе есть элементы. – akash

+0

Список элементов в этом случае является прокси-сервером, который будет загружен при доступе. Поэтому, если ваш доступ к вашему отладчику должен быть загружен данными. Было бы неправильно, если бы журнал запросов загружал данные с помощью запроса uniqueResult. –

ответ

0

Вы можете определить инициализацию декларируя отношения с юридическим лицом. Ваш код будет выглядеть

public class Header{ 
    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @JoinColumn(name="items") 
    private List<Item> items; 
} 

и ваша выборка код будет выглядеть

Criteria criteria = session.createCriteria(Header.class); 
criteria.add(Restrictions.eq("id", id)); 
return (Header) criteria.uniqueResult(); 

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

Но если вы попытаетесь получить доступ за пределами жизненного цикла сеанса, вы получите исключение LazyInitializationException.

+0

Что делать, если я хочу загрузить элементы? каково должно быть ограничение в критериях? – akash

+0

Если вы хотите загрузить все элементы, вам необходимо убедиться, что вы делаете это в активной сессии. Эта ссылка http://stackoverflow.com/a/2192256/873976 может помочь. –

Смежные вопросы