Форум программистов, компьютерный форум, киберфорум
Java EE (J2EE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
1 / 1 / 0
Регистрация: 17.09.2014
Сообщений: 94

Primefaces + Hibenate (порционная загрузка списка)

23.03.2016, 16:59. Показов 4045. Ответов 54
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток.
Есть проект, база данных которых постоянно расширяется и время загрузки некоторых страниц, мягко говоря, оставляет желать лучшего. Проект реализован на primefaces + hibernate + postgresql.
На данных момент прежде чем открыть страницу, где находится какой-то список, загружается список скопом и отображается на xhtml группами по 20.
Прошу помощи подсказать как лучше реализовать порционную загрузку, используя данные технологии в моем случае.

Вот моя визуалка
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<p:dataTable id="dataTable" widgetVar="dataTable" var="row" resizableColumns="true" value="#{listSaleOrder.saleOrderList}" filteredValue="#{listSaleOrder.filteredSaleOrderList}"
                            rowKey= "#{row.id}" selection = "#{listSaleOrder.saleOrder}" selectionMode="single"
                            rows="20" 
                            paginator="true"  
                            paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"   
                            rowsPerPageTemplate="10,20,50" > 
                                
                    <p:column id="dateColumn" styleClass="data-column-date" filterBy="dateDoc" sortBy="dateDoc" headerText="#{lc.GetLI('common.Date','Дата')}" filterMatchMode="contains">  
                        <h:outputText value="#{row.dateDoc}"> 
                            <f:convertDateTime pattern="yyyy-MM-dd"/>
                        </h:outputText>
                    </p:column>  
      
                    <p:column id="numberColumn" styleClass="data-column-number" filterBy="numberDoc" sortBy="numberDoc" headerText="#{lc.GetLI('common.Number','Номер')}" filterMatchMode="contains">  
                        <h:outputText value="#{row.numberDoc}"/>  
                    </p:column>
                    
                    <p:column id="counterpartyColumn" styleClass="data-column-counterparty" filterBy="counterparty.title" sortBy="counterparty.title" headerText="#{lc.GetLI('common.Counterpaty','Контрагент')}" filterMatchMode="contains">  
                        <h:outputText value="#{row.counterparty.title}"/>  
                    </p:column> 
                    
                    <p:column id="title" styleClass="data-column-title" filterBy="title" sortBy="title" headerText="#{lc.GetLI('common.Name','Наименование')}" filterMatchMode="contains">  
                        <h:outputText value="#{row.title}" />  
                    </p:column> 
                    
                    <p:column id="contactNameColumn" styleClass="data-column-contact" filterBy="personByIdPersonContactName.title" sortBy="personByIdPersonContactName.title" headerText="#{lc.GetLI('common.ContactName','Конт. лицо')}" filterMatchMode="contains">  
                        <h:outputText value="#{row.personByIdPersonContactName.title}"/>  
                    </p:column> 
                    
                    <p:column id="statusColumn" styleClass="data-column-status" filterBy="status.title" sortBy="status.title" headerText="#{lc.GetLI('common.Status','Статус')}"  filterOptions="#{listSaleOrder.statusOptions}" filterMatchMode="exact">  
                        <h:outputText value="#{row.status.title}"/>  
                    </p:column> 
                    
                    <p:column id="currencyColumn" styleClass="data-column-currency" filterBy="currencyType.title" sortBy="currencyType.title" headerText="#{lc.GetLI('common.Currency','Валюта')}" filterMatchMode="contains">  
                        <h:outputText value="#{row.currencyType.title}"/>  
                    </p:column>
                    
                    <p:column id="totalColumn" styleClass="data-column-total" headerText="#{lc.GetLI('common.Summa','Сумма')}">  
                        <h:outputText value=" #{row.totalGeneral}"/>  
                    </p:column> 
                    
                    <p:column id="ownerColumn" styleClass="data-column-owner" filterBy="personByIdPersonOwner.title" sortBy="personByIdPersonOwner.title" headerText="#{lc.GetLI('common.OwnerOrder','Владелец заказа')}">  
                        <h:outputText value="#{row.personByIdPersonOwner.title}" />  
                    </p:column>              
                </p:dataTable>
Вот как в контроллере вытягиваю данный лист
Java
1
setSaleOrderList(SaleOrderHelper.getSaleOrderList(saleOrderWhereSQL));
И вот мой уровень хэлперов
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@SuppressWarnings("unchecked")
    public static final List<SaleOrder> getSaleOrderList(
            String saleOrderWhereSQL) {
 
        try {
 
            List<SaleOrder> resultList = null;
            Session session = HibernateUtil.getSessionFactory()
                    .getCurrentSession();
            session.beginTransaction();
            Query q = session.createQuery(
                    "from SaleOrder as so " + "left join fetch so.counterparty "
                            + "left join fetch so.counterparty.counterpartyType "
                            + "left join fetch so.currencyType "
                            + "left join fetch so.personByIdPersonContactName "
                            + "left join fetch so.personByIdPersonOwner "
                            + "left join fetch so.personByIdPersonEmployee "
                            + "left join fetch so.personByIdPersonLastChanged "
                            + "left join fetch so.organization "
                            + "left join fetch so.pointOfSale "
                            + "left join fetch so.status " + " where 1=1 "
                            + saleOrderWhereSQL
                            + " order by so.dateDoc desc, so.numberDoc desc ");
            resultList = (List<SaleOrder>) q.list();
            session.getTransaction().commit();
            return resultList;
 
        } catch (Exception e) {
 
            HibernateUtil.getSessionFactory().getCurrentSession()
                    .getTransaction().rollback();
            return null;
 
        }
 
    }
Буду рад любой помощи.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.03.2016, 16:59
Ответы с готовыми решениями:

Порционная загрузка с AsyncTask и бесконечный скролл
Есть большой JSON с текстом и картинками. С помощью AsyncTask я гружу все данные, но возникла необходимость их грузить порционно,...

Spring + hibenate, REST
Здравствуйте. Пишу учебный проект, spring + hibenate @Controller @RestController public class WebService { @Autowired ...

Порционная выборка записей из бд
Подскажите пожалуйста, как можно в GridView выводить записи по частям?Например,выводить первые 500 записей из бд а остальные подгружають...

54
149 / 162 / 48
Регистрация: 19.10.2012
Сообщений: 530
23.03.2016, 17:31
Цитата Сообщение от TAHKICT Посмотреть сообщение
Есть проект, база данных которых постоянно расширяется и время загрузки некоторых страниц, мягко говоря, оставляет желать лучшего.
Скорее всего проблема в не оптимальной работе с бд. Может лучше пересмотреть этот слой?
Если
Цитата Сообщение от TAHKICT Посмотреть сообщение
загружается список скопом и отображается на xhtml группами по 20.
Прошу помощи подсказать как лучше реализовать порционную загрузку, используя данные технологии в моем случае.
Имеется в виду доставать записи из базы не скопом? Тогда session.createQuery("yourQuery").setMaxR esults(20).setFirstResult(n)
Цитата Сообщение от TAHKICT Посмотреть сообщение
используя данные технологии
Это критично? JPA позволяет делать более читаемый и удобный в сопровождении код.
0
1 / 1 / 0
Регистрация: 17.09.2014
Сообщений: 94
23.03.2016, 17:48  [ТС]
Любопытный,
1. Насчет оптимальности я предложу своим пересмотреть, спасибо.
2. Интересный вариант, правда насколько проблематично будет его внедрить в уже сущестувющий код? Получается в setFirstResult(n) n - это типа номер страницы с результатами?
3. Я думаю да, проект уже больше 3 лет разрабатывается, а мне бы просто доработать порционную загрузку больших списков.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
23.03.2016, 18:04
Цитата Сообщение от TAHKICT Посмотреть сообщение
Получается в setFirstResult(n) n - это типа номер страницы с результатами?
нет, это номер записи с которой надо начинать отсчет. При каждом запросе на след. страницу, вы должны передавать последнюю запись на предыдущей странице.

Добавлено через 2 минуты
Вообще по гуглу primefaces pagination довольно много результатов. Вот например
http://www.primefaces.org/show... lazy.xhtml
0
1 / 1 / 0
Регистрация: 17.09.2014
Сообщений: 94
29.03.2016, 09:38  [ТС]
Любопытный, KEKCoGEN, Начал продвигаться в моем направлении с помощью ваших подсказок, но запнулся на одном моменте. У меня уже вроде было все готово для использования ленивой выгрузки, но она все не работала. А потом я интереса ради к своему старому запросу к бд просто добавил
Java
1
.setMaxResults(10)
но оказалось банально что это не работает. Из базы выгружаются абсолютно все записи как и раньше, просто в результате выдает всего 10. Что я не так делаю, подскажите пожалуйста.
0
149 / 162 / 48
Регистрация: 19.10.2012
Сообщений: 530
29.03.2016, 09:55
Добавьте код, и лог с запросом, который отправляет хибернейт.
0
1 / 1 / 0
Регистрация: 17.09.2014
Сообщений: 94
29.03.2016, 10:34  [ТС]
Любопытный, Это лог
Java
1
2
3
2016-03-29T10:32:01.926+0300|Warning: PWC4011: Unable to set request character encoding to UTF-8 from context /Obriy, because request parameters have already been read, or ServletRequest.getReader() has already been called
2016-03-29T10:32:01.968+0300|Warning: Setting non-serializable attribute value into ViewMap: (key: lc, value class: ua.obriy.controller.localization.LocalizationController)
2016-03-29T10:32:02.631+0300|WARN: HHH000104: firstResult/maxResults specified with collection fetch; applying in memory!
Я так понимаю последний это наш.
А вот код хелпера
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Session session = HibernateUtil.getSessionFactory()
                    .getCurrentSession();
            session.beginTransaction();
            Query q = session.createQuery("from Product as tab "
                    + "left join fetch tab.operationType "
                    + "left join fetch tab.productType "//+
                    + "left join fetch tab.saleOrder "//+
                    + "left join fetch tab.saleOrder.counterparty "//+
                    + "left join fetch tab.saleOrder.currencyType "//+
                    + "left join fetch tab.saleOrder.personByIdPersonOwner "
                    + "left join fetch tab.status "//+
                    + "left join fetch tab.reservationOrder "
                    + "left join fetch tab.reservationOrder.currencyType "//+
                    + "left join fetch tab.saleOrderPersonProducts as sopp "
                    + "left join fetch sopp.person "
                    + "left join fetch tab.counterpartyProducts as cp "
                    + "left join fetch cp.counterparty "
                    + "left join fetch tab.productExternalDataBases as pedb "
                    + "left join fetch pedb.externalDataBase "
                    + "left join fetch tab.queueObjects as qo "
                    + "left join fetch qo.queueList "
                    + "left join fetch tab.productRailways as pr "
                    + " where 1=1 " + productWhereSQL
                    + " order by tab.dateDoc desc, tab.numberDoc desc").setMaxResults(10);
            
            @SuppressWarnings("unchecked")
            List<Product> productList = (List<Product>) q.list();
0
149 / 162 / 48
Регистрация: 19.10.2012
Сообщений: 530
29.03.2016, 10:44
Цитата Сообщение от TAHKICT Посмотреть сообщение
2016-03-29T10:32:02.631+0300|WARN: HHH000104: firstResult/maxResults specified with collection fetch; applying in memory!
Эта строка ключевая.
http://stackoverflow.com/quest... maxresults тут подробно описано, почему так.
0
1 / 1 / 0
Регистрация: 17.09.2014
Сообщений: 94
29.03.2016, 11:39  [ТС]
Любопытный, Как я понял это из-за того что в запросе я использую "join fetch". То есть как вариант загружать мои объекты без "join fetch", а потом просто создавать новый список и по отдельности выгружать каждый объект со связями по айди, верно?
0
149 / 162 / 48
Регистрация: 19.10.2012
Сообщений: 530
29.03.2016, 12:16
TAHKICT, Вам виднее, вы ведь знаете как у вас построена структура отношений, и какие данные вам нужно получить.
Я бы на Вашем месте таки включил логирование sql-запросов и генерацию статистики, и внимательно просмотрел как эти запросы проходят, потом просмотрел план выполнения запросов, может есть узкие места и Вы делаете дурную работу.
0
1 / 1 / 0
Регистрация: 17.09.2014
Сообщений: 94
04.04.2016, 20:01  [ТС]
Любопытный, KEKCoGEN, Извините что беспокою Вас. А как мне быть с фильтрами? Допустим саму порционную загрузку я сделаю хитромудрыми запросами к базе. Просто на xhtml у меня у меня располагается таблица, данные в которой заполняются из различных связанных объектов. Можно как-то реализовать фильтрацию по полям тех связанных объектов (что-бы искать по всей базе данных, а не только по тем 20 строкам, которые отображаются).
Очень надеюсь на вашу помощь.
0
149 / 162 / 48
Регистрация: 19.10.2012
Сообщений: 530
04.04.2016, 20:14
TAHKICT, добавить условие фильтрации в спецификацию SQL запроса.
0
1 / 1 / 0
Регистрация: 17.09.2014
Сообщений: 94
04.04.2016, 22:10  [ТС]
Любопытный, а какой массив данных мы будем фильтровать? Просто, как я понял, у меня будет следующую логика загрузки данных
1. Идет запрос к бд по выборке данных с использованием "setMaxResults(n).setFirstResult(n)"
2. Затем по вытянутому списку я вытягиваю все необходимые зависимости.
3. Формирую список обёрток и отправляю на xhtml

Я так понимаю мне придется отказаться от оберток?
И какова логика фильтра будет?

Извините за глупые вопросы может быть.

Сейчас у меня выгружается весь список объектов со всеми необходимыми зависимостями, создается список оберток и передаем на отображение. А потом классическим инструментом primefaces производится фильтрация.
0
149 / 162 / 48
Регистрация: 19.10.2012
Сообщений: 530
05.04.2016, 08:04
TAHKICT, если Вы выгружаете данные блоками, используя пагинацию, то для фильтрации/сортировки нужно делать новый запрос в базу, с соответствующими операторами и условиями.
0
1 / 1 / 0
Регистрация: 17.09.2014
Сообщений: 94
07.04.2016, 14:13  [ТС]
KEKCoGEN, Любопытный, Привет еще раз. Хочу вот побороть просто порционную загрузку. Написал хэлпер, который может работать setMaxResults(n).setFirstResult(n) и проверил его работоспособность. Следуя различным способам реализации lazymodel сделал свою.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
@ManagedBean(name="productItemController")
@ViewScoped
public class ProductItemController implements Serializable{
 
    private static final long serialVersionUID = 1L;
 
    public ProductItemController() {}
    
    @ManagedProperty(value="#{productItemDAO}")
    ProductItemDAO productItemDAO;
 
    public ProductItemDAO getProductItemService() {
        return productItemDAO;
    }
 
    public void setProductItemDAO(ProductItemDAO productItemDAO) {
        this.productItemDAO = productItemDAO;
    }
    
    private LazyDataModel<ProductItem> dataSource;
    private List<ProductItem> productItemList;
    
    
    public List<ProductItem> getProductItemList() {
        return productItemList;
    }
 
    public void setProductItemList(List<ProductItem> productItemList) {
        this.productItemList = productItemList;
    }
 
    public LazyDataModel<ProductItem> getDataSource() {
        return dataSource;
    }
 
    public void setDataSource(LazyDataModel<ProductItem> dataSource) {
        this.dataSource = dataSource;
    }
 
    @PostConstruct
    public void init() {
        
        dataSource = new LazyDataModel<ProductItem>() {
    
            private static final long serialVersionUID = 1L;
 
            @Override
            public List<ProductItem> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,String> filters) {
                productItemList = ProductHelper.getProductItemLazyList(first, pageSize);
                setRowCount(productItemList.size());
                return productItemList;
                
            }
            
            @Override
            public Object getRowKey(ProductItem productItem) {
                return productItem.getId();
            }
            
            @Override
            public ProductItem getRowData(String rowKey) {
                
                for(ProductItem p:productItemList) {
                    if(String.valueOf(p.getId()).equals(rowKey))
                        return p;
                }
                return null;
            }
            
        }; 
    }
}
Скорость загрузки все равно как будто снова выгружается весь список. Подскажите, может я что-то упустил. Буду очень благодарен!
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
07.04.2016, 14:20
Цитата Сообщение от TAHKICT Посмотреть сообщение
ProductHelper.getProductItemLazyList(fir st, pageSize);
покажите этот метод

Так же включите отображение запросов к БД в хибернейте и смотрите какой запрос выходит
0
149 / 162 / 48
Регистрация: 19.10.2012
Сообщений: 530
07.04.2016, 14:23
Цитата Сообщение от TAHKICT Посмотреть сообщение
Скорость загрузки все равно как будто снова выгружается весь список.
Выведите в лог подробную информацию по транзакциям в бд, вместе с метриками и посмотрите что именно тормозит, и как выглядит итоговый запрос.
0
1 / 1 / 0
Регистрация: 17.09.2014
Сообщений: 94
07.04.2016, 14:36  [ТС]
KEKCoGEN, Любопытный,
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
public static final List<ProductItem> getProductItemLazyList(int first,
            int pageSize) {
 
        List<ProductItem> resultList = null;
 
        try {
            int count = 0;
            Session session = HibernateUtil.getSessionFactory()
                    .getCurrentSession();
            session.beginTransaction();
            Query q = session
                    .createQuery(
                            "from Product")
                    .setFirstResult(first).setMaxResults(pageSize);
 
            @SuppressWarnings("unchecked")
            List<Product> lazyProductList = (List<Product>) q.list();
            
            /*Now we have lazy list without connections,
             * we should get this list with connections.
             * So lets make cycle of db request to make it.
             */
            
            List<Product> productList = new ArrayList<>();
            
            for (int i = 0; i < lazyProductList.size(); i++) {
                long arg = lazyProductList.get(i).getId();
                Query q1 = session.createQuery("from Product as tab "
                        + "left join fetch tab.operationType "
                        + "left join fetch tab.organization "
                        + "left join fetch tab.personByIdPersonEmployee "
                        + "left join fetch tab.personByIdPersonLastChanged "
                        + "left join fetch tab.personByIdPersonResponsible "
                        + "left join fetch tab.priceType "
                        + "left join fetch tab.productType "
                        + "left join fetch tab.saleOrder "
                        + "left join fetch tab.saleOrder.counterparty "
                        + "left join fetch tab.saleOrder.currencyType "
                        + "left join fetch tab.saleOrder.personByIdPersonOwner "
                        + "left join fetch tab.status "
                        + "left join fetch tab.reservationOrder "
                        + "left join fetch tab.reservationOrder.counterparty "
                        + "left join fetch tab.reservationOrder.counterparty.counterpartyType "
                        + "left join fetch tab.reservationOrder.currencyType "
                        + "left join fetch tab.reservationOrder.gds "
                        + "left join fetch tab.reservationOrder.organization "
                        + "left join fetch tab.reservationOrder.pointOfSale "
                        + "left join fetch tab.reservationOrder.personByIdPersonEmployee "
                        + "left join fetch tab.unit "
                        + "left join fetch tab.saleOrderPersonProducts as sopp "
                        + "left join fetch sopp.person "
                        + "left join fetch tab.counterpartyProducts as cp "
                        + "left join fetch cp.counterparty "
                        + "left join fetch tab.productExternalDataBases as pedb "
                        + "left join fetch pedb.externalDataBase "
                        + "left join fetch tab.queueObjects as qo "
                        + "left join fetch qo.queueList "
                        + "left join fetch tab.productRailways as pr "
                        + "where tab.id=:arg"
                        );
                q1.setLong("arg", arg);
                @SuppressWarnings("unchecked")
                List<Product> currentResultList = (List<Product>) q1.list();
                
                if (!currentResultList.isEmpty())
                    productList.add((Product) currentResultList.get(0));
            }
            
            session.getTransaction().commit();
 
            if (productList != null && !productList.isEmpty()) {
 
                resultList = new ArrayList<ProductItem>();
                long id = 0;
                for (Product elp : productList) {
 
                    if (elp.getId() != id) {
                        ProductItem item = new ProductItem();
                        item.setId(elp.getId());
                        item.setProduct(elp);
 
                        item.setPersons(new String());
 
                        Set<SaleOrderPersonProduct> soppSet = elp
                                .getSaleOrderPersonProducts();
 
                        if (soppSet != null && !soppSet.isEmpty()) {
                            count = 0;
 
                            for (SaleOrderPersonProduct sopp : soppSet) {
                                if (sopp.getPerson() != null
                                        && sopp.getPerson().getTitle() != null) {
                                    count++;
                                    item.setPersons(item.getPersons()
                                            + sopp.getPerson().getTitle()
                                                    .trim()
                                            + (count == soppSet.size() ? ""
                                                    : ", "));
                                }
 
                            }
                        }
 
                        item.setPayers(new String());
 
                        Set<CounterpartyProduct> cpSet = elp
                                .getCounterpartyProducts();
 
                        if (cpSet != null && !cpSet.isEmpty()) {
                            count = 0;
 
                            for (CounterpartyProduct cp : cpSet) {
                                if (cp.getCounterparty() != null
                                        && cp.getCounterparty().getTitle() != null) {
                                    count++;
                                    item.setPayers(item.getPayers()
                                            + cp.getCounterparty().getTitle()
                                                    .trim()
                                            + (count == cpSet.size() ? ""
                                                    : ", "));
                                }
 
                            }
                        }
 
                        item.setNumber1c(new String());
 
                        Set<ProductExternalDataBase> pedbSet = elp
                                .getProductExternalDataBases();
 
                        if (pedbSet != null && !pedbSet.isEmpty()) {
                            for (ProductExternalDataBase pedb : pedbSet) {
                                if (pedb.getExternalDataBase() != null
                                        && pedb.getExternalDataBase().getCode() != null
                                        && pedb.getExternalDataBase().getCode()
                                                .equals("1C")) {
                                    item.setNumber1c(pedb.getTitle());
                                }
 
                            }
                        }
 
                        item.setNumberDoc(new String());
 
                        Set<ProductRailway> prSet = elp.getProductRailways();
 
                        if (prSet != null && !prSet.isEmpty()) {
                            for (ProductRailway pr : prSet) {
                                item.setNumberDoc(pr.getTicketNumber());
                            }
                        } else {
                            item.setNumberDoc(elp.getNumberDoc());
                        }
 
                        item.setQueues(new String());
 
                        Set<QueueObject> qoSet = elp.getQueueObjects();
 
                        if (qoSet != null && !qoSet.isEmpty()) {
                            count = 0;
 
                            for (QueueObject qo : qoSet) {
                                if (qo.getQueueList() != null
                                        && qo.getQueueList().getTitle() != null) {
                                    count++;
                                    item.setQueues(item.getQueues()
                                            + qo.getQueueList().getTitle()
                                                    .trim()
                                            + (count == qoSet.size() ? ""
                                                    : ", "));
                                }
 
                            }
                        }
 
                        if (elp.getSaleOrder() != null
                                && elp.getReservationOrder() != null
                                && elp.getSaleOrder().getCurrencyType() != null
                                && elp.getReservationOrder().getCurrencyType() != null
                                && elp.getSaleOrder().getCurrencyType().getId() != elp
                                        .getReservationOrder()
                                        .getCurrencyType().getId()) {
 
                            item.setProviderFeeSOC(Calculation
                                    .CalculateValue(elp.getReservationOrder()
                                            .getCurrencyRate(), elp
                                            .getSaleOrder().getCurrencyRate(),
                                            elp.getProviderFee()));
 
                        } else {
 
                            item.setProviderFeeSOC(elp.getProviderFee() == null ? BigDecimal.ZERO
                                    : elp.getProviderFee());
 
                        }
 
                        id = elp.getId();
                        resultList.add(item);
                    }
                }
            }
 
            return resultList;
 
        } catch (Exception e) {
 
            HibernateUtil.getSessionFactory().getCurrentSession()
                    .getTransaction().rollback();
            System.out.println(e.getMessage());
            return null;
 
        }
    }
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
07.04.2016, 14:40
Цитата Сообщение от TAHKICT Посмотреть сообщение
for (int i = 0; i < lazyProductList.size(); i++) {
* * * * * * * * long arg = lazyProductList.get(i).getId();
* * * * * * * * Query q1 = session.createQuery("from Product as tab "
* * * * * * * * * * * * + "left join fetch tab.operationType "
* * * * * * * * * * * * + "left join fetch tab.organization "
* * * * * * * * * * * * + "left join fetch tab.personByIdPersonEmployee "
* * * * * * * * * * * * + "left join fetch tab.personByIdPersonLastChanged "
* * * * * * * * * * * * + "left join fetch tab.personByIdPersonResponsible "
* * * * * * * * * * * * + "left join fetch tab.priceType "
* * * * * * * * * * * * + "left join fetch tab.productType "
* * * * * * * * * * * * + "left join fetch tab.saleOrder "
* * * * * * * * * * * * + "left join fetch tab.saleOrder.counterparty "
* * * * * * * * * * * * + "left join fetch tab.saleOrder.currencyType "
* * * * * * * * * * * * + "left join fetch tab.saleOrder.personByIdPersonOwner "
* * * * * * * * * * * * + "left join fetch tab.status "
* * * * * * * * * * * * + "left join fetch tab.reservationOrder "
* * * * * * * * * * * * + "left join fetch tab.reservationOrder.counterparty "
* * * * * * * * * * * * + "left join fetch tab.reservationOrder.counterparty.counte rpartyType "
* * * * * * * * * * * * + "left join fetch tab.reservationOrder.currencyType "
* * * * * * * * * * * * + "left join fetch tab.reservationOrder.gds "
* * * * * * * * * * * * + "left join fetch tab.reservationOrder.organization "
* * * * * * * * * * * * + "left join fetch tab.reservationOrder.pointOfSale "
* * * * * * * * * * * * + "left join fetch tab.reservationOrder.personByIdPersonEmp loyee "
* * * * * * * * * * * * + "left join fetch tab.unit "
* * * * * * * * * * * * + "left join fetch tab.saleOrderPersonProducts as sopp "
* * * * * * * * * * * * + "left join fetch sopp.person "
* * * * * * * * * * * * + "left join fetch tab.counterpartyProducts as cp "
* * * * * * * * * * * * + "left join fetch cp.counterparty "
* * * * * * * * * * * * + "left join fetch tab.productExternalDataBases as pedb "
* * * * * * * * * * * * + "left join fetch pedb.externalDataBase "
* * * * * * * * * * * * + "left join fetch tab.queueObjects as qo "
* * * * * * * * * * * * + "left join fetch qo.queueList "
* * * * * * * * * * * * + "left join fetch tab.productRailways as pr "
* * * * * * * * * * * * + "where tab.id=:arg"
* * * * * * * * * * * * );
* * * * * * * * q1.setLong("arg", arg);
Что то мне подсказывает что это не самый быстрый в мире запрос. Да ещё и вызываемый N раз.

Ну и остальной код ужасен
0
149 / 162 / 48
Регистрация: 19.10.2012
Сообщений: 530
07.04.2016, 14:56
Вы получаете полный список записей из Product, а потом по каждому из итемов записи делаете вон тот монструозный запрос, где же тут лейзи? Оптимизируйте запросы. Еще раз говорю, посмотрите как этот запрос выглядит в конечном варианте, что именно запрашивается из бд, потом просмотрите профиль запроса и увидите почему оно так долго выполняется и что можно изменить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.04.2016, 14:56
Помогаю со студенческими работами здесь

primefaces
Можно ли использвать primefaces на JSP?

Загрузка списка из БД
Ситуация следующая: 1. Пользователь добавляет сообщение, в котором есть такой список: &lt;select name=&quot;floor&quot;...

JSF primefaces
Здравствуйте. В этой сфере новичок, возможно такая тема уже была, но всё же. Есть форма логина ..../faces/login.xhtml При успешной...

Сортировка, Primefaces
Нужно сделать сортировку значений по полям. Когда нажимаю кнопку отсортировать, то одно значение повторяется несколько раз. Кто-нибудь...

Загрузка двухуровнего списка
Здравствуйте, нужно загрузить двухуровневый список, то есть в идеале сначала главный уровень, а по нажатию загрузить дочерний и отобразить....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru