package io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.impl.dao; import io.oasp.gastronomy.restaurant.general.common.api.constants.NamedQueries; import io.oasp.gastronomy.restaurant.general.dataaccess.base.dao.ApplicationDaoImpl; import io.oasp.gastronomy.restaurant.offermanagement.dataaccess.api.OfferEntity; import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.OrderPositionState; import io.oasp.gastronomy.restaurant.salesmanagement.common.api.datatype.ProductOrderState; import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.OrderPositionEntity; import io.oasp.gastronomy.restaurant.salesmanagement.dataaccess.api.dao.OrderPositionDao; import io.oasp.gastronomy.restaurant.salesmanagement.logic.api.to.OrderPositionSearchCriteriaTo; import java.util.List; import javax.inject.Named; import com.mysema.query.alias.Alias; import com.mysema.query.jpa.JPASubQuery; import com.mysema.query.jpa.impl.JPAQuery; import com.mysema.query.types.path.EntityPathBase; import com.mysema.query.types.query.ListSubQuery; /** * Implementation of {@link OrderPositionDao}. * */ @Named public class OrderPositionDaoImpl extends ApplicationDaoImpl<OrderPositionEntity> implements OrderPositionDao { @Override public Class<OrderPositionEntity> getEntityClass() { return OrderPositionEntity.class; } @Override public List<OrderPositionEntity> findOrderPositionsByOrder(Long orderId) { OrderPositionEntity orderPosition = Alias.alias(OrderPositionEntity.class); EntityPathBase<OrderPositionEntity> alias = Alias.$(orderPosition); JPAQuery query = new JPAQuery(getEntityManager()).from(alias); query.where(Alias.$(orderPosition.getOrder().getId()).eq(orderId)); return query.list(alias); } @Override public List<OrderPositionEntity> findOpenOrderPositionsByOrder(Long orderId) { return getEntityManager() .createNamedQuery(NamedQueries.GET_OPEN_ORDER_POSITIONS_FOR_ORDER, OrderPositionEntity.class) .setParameter("orderId", orderId).getResultList(); } @Override public List<OrderPositionEntity> findOrderPositions(OrderPositionSearchCriteriaTo criteria) { OrderPositionEntity orderPosition = Alias.alias(OrderPositionEntity.class); EntityPathBase<OrderPositionEntity> alias = Alias.$(orderPosition); JPAQuery query = new JPAQuery(getEntityManager()).from(alias); Long orderId = criteria.getOrderId(); if (orderId != null) { query.where(Alias.$(orderPosition.getOrder().getId()).eq(orderId)); } Long cookId = criteria.getCookId(); if (cookId != null) { query.where(Alias.$(orderPosition.getCookId()).eq(cookId)); } OrderPositionState state = criteria.getState(); if (state != null) { query.where(Alias.$(orderPosition.getState()).eq(state)); } ProductOrderState drinkState = criteria.getDrinkState(); if (drinkState != null) { query.where(Alias.$(orderPosition.getDrinkState()).eq(drinkState)); } if (criteria.isMealOrSideDish()) { OfferEntity offer = Alias.alias(OfferEntity.class); EntityPathBase<OfferEntity> offerAlias = Alias.$(offer); JPASubQuery subQuery = new JPASubQuery().from(offerAlias).where( Alias.$(offer.getMeal().getId()).isNotNull().or(Alias.$(offer.getSideDish().getId()).isNotNull())); ListSubQuery<Long> listSubQuery = subQuery.list(Alias.$(offer.getId())); query.where(Alias.$(orderPosition.getOfferId()).in(listSubQuery)); // // // query.innerJoin(offer.).on(Alias.$(orderPosition.getOfferId()).eq(Alias.$(offer.getId()))) // .where(Alias.$(offer.getMealId()).isNotNull().or(Alias.$(offer.getSideDishId()).isNotNull())); } applyPagination(criteria.getPagination(), query); return query.list(alias); } }