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 package fr.paris.lutece.plugins.stock.business.provider;
35
36 import fr.paris.lutece.plugins.stock.commons.ResultList;
37 import fr.paris.lutece.plugins.stock.commons.dao.AbstractStockDAO;
38 import fr.paris.lutece.plugins.stock.commons.dao.PaginationProperties;
39 import fr.paris.lutece.plugins.stock.service.StockPlugin;
40 import fr.paris.lutece.plugins.stock.utils.jpa.StockJPAUtils;
41
42 import java.util.ArrayList;
43 import java.util.List;
44
45 import javax.persistence.EntityManager;
46 import javax.persistence.TypedQuery;
47 import javax.persistence.criteria.CriteriaBuilder;
48 import javax.persistence.criteria.CriteriaQuery;
49 import javax.persistence.criteria.JoinType;
50 import javax.persistence.criteria.Order;
51 import javax.persistence.criteria.Predicate;
52 import javax.persistence.criteria.Root;
53
54 import org.apache.commons.lang3.StringUtils;
55
56
57
58
59 public final class ProviderDAO extends AbstractStockDAO<Integer, Provider> implements IProviderDAO
60 {
61
62
63
64 @Override
65 public String getPluginName( )
66 {
67 return StockPlugin.PLUGIN_NAME;
68 }
69
70
71
72
73
74
75
76
77 public List<Provider> findAllWithProducts( PaginationProperties paginationProperties )
78 {
79 EntityManager em = getEM( );
80 CriteriaBuilder cb = em.getCriteriaBuilder( );
81
82 CriteriaQuery<Provider> cq = cb.createQuery( Provider.class );
83
84 Root<Provider> root = cq.from( Provider.class );
85 root.fetch( Provider_.products, JoinType.LEFT );
86 cq.distinct( true );
87
88 TypedQuery<Provider> query = em.createQuery( cq );
89
90 return query.getResultList( );
91 }
92
93
94
95
96
97
98
99
100 public Provider findByIdWithProducts( int nId )
101 {
102 EntityManager em = getEM( );
103 CriteriaBuilder cb = em.getCriteriaBuilder( );
104
105 CriteriaQuery<Provider> cq = cb.createQuery( Provider.class );
106
107 Root<Provider> root = cq.from( Provider.class );
108 root.fetch( Provider_.products, JoinType.LEFT );
109 cq.where( cb.equal( root.get( Provider_.id ), nId ) );
110 cq.distinct( true );
111
112 TypedQuery<Provider> query = em.createQuery( cq );
113
114 return query.getSingleResult( );
115 }
116
117
118
119
120
121
122
123
124
125
126 public ResultList<Provider> findByFilter( ProviderFilter filter, PaginationProperties paginationProperties )
127 {
128 EntityManager em = getEM( );
129 CriteriaBuilder cb = em.getCriteriaBuilder( );
130
131 CriteriaQuery<Provider> cq = cb.createQuery( Provider.class );
132
133 Root<Provider> root = cq.from( Provider.class );
134 buildCriteriaQuery( filter, root, cq, cb );
135 buildSortQuery( filter, root, cq, cb );
136 cq.distinct( true );
137
138 return createPagedQuery( cq, paginationProperties ).getResultList( );
139 }
140
141
142
143
144
145
146
147
148
149
150
151
152
153 private void buildCriteriaQuery( ProviderFilter filter, Root<Provider> root, CriteriaQuery<Provider> query, CriteriaBuilder builder )
154 {
155
156 List<Predicate> listPredicates = new ArrayList<>( );
157
158 if ( StringUtils.isNotBlank( filter.getName( ) ) )
159 {
160 listPredicates.add( builder.like( root.get( Provider_.name ), StockJPAUtils.buildCriteriaLikeString( filter.getName( ) ) ) );
161 }
162
163 if ( StringUtils.isNotBlank( filter.getAddress( ) ) )
164 {
165 listPredicates.add( builder.like( root.get( Provider_.address ), StockJPAUtils.buildCriteriaLikeString( filter.getAddress( ) ) ) );
166 }
167
168 if ( StringUtils.isNotBlank( filter.getContactName( ) ) )
169 {
170 listPredicates.add( builder.like( root.get( Provider_.contactName ), StockJPAUtils.buildCriteriaLikeString( filter.getContactName( ) ) ) );
171 }
172
173 if ( StringUtils.isNotBlank( filter.getMail( ) ) )
174 {
175 listPredicates.add( builder.like( root.get( Provider_.mail ), StockJPAUtils.buildCriteriaLikeString( filter.getMail( ) ) ) );
176 }
177
178 if ( StringUtils.isNotBlank( filter.getPhoneNumber( ) ) )
179 {
180 listPredicates.add( builder.like( root.get( Provider_.phoneNumber ), StockJPAUtils.buildCriteriaLikeString( filter.getPhoneNumber( ) ) ) );
181 }
182
183 if ( filter.isProducts( ) )
184 {
185 root.fetch( Provider_.products, JoinType.LEFT );
186 }
187
188 if ( !listPredicates.isEmpty( ) )
189 {
190
191 query.where( listPredicates.toArray( new Predicate [ listPredicates.size( )] ) );
192 }
193 }
194
195
196
197
198
199
200
201
202
203
204
205
206
207 private void buildSortQuery( ProviderFilter filter, Root<Provider> root, CriteriaQuery<Provider> query, CriteriaBuilder builder )
208 {
209 if ( filter.getOrders( ) != null && !filter.getOrders( ).isEmpty( ) )
210 {
211 List<Order> orderList = new ArrayList<>( );
212
213 if ( filter.isOrderAsc( ) )
214 {
215
216 for ( String order : filter.getOrders( ) )
217 {
218 orderList.add( builder.asc( root.get( order ) ) );
219 }
220 }
221 else
222 {
223
224 for ( String order : filter.getOrders( ) )
225 {
226 orderList.add( builder.desc( root.get( order ) ) );
227 }
228 }
229
230 query.orderBy( orderList );
231 }
232 }
233 }