Контекст: Разработка собственных веб-приложений с использованием игрового фреймворка (1.3), спящего режима (4.3.8) и некоторых Groovy со стороны html.Извлеките детей от ленивых ко многим спискам
В настоящее время я работаю с Hibernate, и мне было поручено найти некоторые методы оптимизации. У нас есть проблема с загрузкой, потому что все происходит лениво, и когда мы пытаемся получить к нему доступ с Groovy, Hibernate будет проливать тонны запросов, которые занимают огромное количество времени, делая наши приложения очень медленными.
Так что я пытаюсь настроить наш метод find, чтобы получить все, что мне нужно, чтобы Hibernate не нужно.
Вот мой класс:
@Entity @Table(name="business_partner", schema = "public") public class BusinessPartner extends Model{ @Id @Column(name="business_partner_id", updatable=false, nullable=false) @GeneratedValue(strategy=GenerationType.TABLE, generator="businessPartnerGenerator") @TableGenerator(name="businessPartnerGenerator", table="key_generator", pkColumnName="table_name", valueColumnName="next_id", allocationSize=1) private Integer businessPartnerId; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "airline_id") @Unique private Airline airline; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "trader_country_id") private Country traderCountry; @Column(name = "name", nullable = false) @Required @MaxSize(50) @Unique private String name; @Column(name = "code", updatable = false) @MaxSize(5) @Unique private String code; @Column(name = "is_active", nullable = false) private Boolean isActive; @OneToMany(fetch = FetchType.LAZY, mappedBy="businessPartner", cascade=CascadeType.ALL) @Fetch(FetchMode.SUBSELECT) private List lstBusinessPartnerTypes = new ArrayList(); @OneToMany(fetch = FetchType.LAZY, mappedBy="businessPartner", cascade=CascadeType.ALL) @Fetch(FetchMode.SUBSELECT) private List lstBusinessPartnerAddresses = new ArrayList();
Вот мои критерии:
public static List findAll(){ Session oSession = SessionManager.createSession(); List lstBusinessPartners = (List)oSession.createCriteria(BusinessPartner.class) .createAlias("lstBusinessPartnerAddresses", "lstBPA") .createAlias("lstBusinessPartnerTypes", "lstBPT") .setFetchMode("airline", FetchMode.JOIN) .setFetchMode("lstBPA.country", FetchMode.SELECT) .setFetchMode("lstBPT.typeBusinessPartner", FetchMode.SELECT) .addOrder(Order.asc("code")) .list(); SessionManager.closeSession(oSession); return lstBusinessPartners; }
Так мне нужно открыть авиакомпанию и ребенка каждого из многих списков.
Я могу получить доступ к авиакомпании, там нет проблем. Это когда я пытаюсь получить доступ к объекту в списке, который становится сложным. Я не могу загрузить списки и их дочерние элементы (как вы можете видеть из моих критериев, я пытаюсь получить доступ к стране в одном списке и набирать бизнес-партнера в другом). Я получаю этот вид запроса для каждого делового партнера:
Так что мой вопрос заключается в следующем: можно ли принести ленивый список, используя критерии? И если да, то как?