package com.hongqiang.shop.modules.user.dao; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; import javax.persistence.NoResultException; import org.hibernate.Query; import javax.persistence.FlushModeType; import org.springframework.stereotype.Repository; import com.hongqiang.shop.common.base.persistence.BaseDaoImpl; import com.hongqiang.shop.common.base.persistence.Page; import com.hongqiang.shop.common.utils.Pageable; import com.hongqiang.shop.modules.entity.Member; import com.hongqiang.shop.modules.entity.Order; @Repository public class MemberDaoImpl extends BaseDaoImpl<Member, Long> implements MemberDaoCustom { @Override public Member findByUsername(String username) { if (username == null) return null; try { String str = "select members from Member members where lower(members.username) = lower(:username)"; return (Member) this.getEntityManager() .createQuery(str, Member.class) .setFlushMode(FlushModeType.COMMIT) .setParameter("username", username).getSingleResult(); } catch (NoResultException localNoResultException1) { } return null; } @Override public List<Member> findListByEmail(String email) { if (email == null) return Collections.emptyList(); String str = "select members from Member members where lower(members.email) = lower(:email)"; return this.getEntityManager().createQuery(str, Member.class) .setFlushMode(FlushModeType.COMMIT) .setParameter("email", email).getResultList(); } public Long count(Date beginDate, Date endDate) { String sqlString = "select DISTINCT o.member " + "from Order o where 1=1 "; List<Object> params = new ArrayList<Object>(); if (beginDate != null) { sqlString += " and o.createDate >= ?"; params.add(beginDate); } if (endDate != null) { sqlString += " and o.createDate <= ?"; params.add(endDate); } sqlString += " and o.orderStatus = ?"; params.add(Order.OrderStatus.completed); StringBuilder stringBuilder = new StringBuilder(sqlString); return super.count(stringBuilder, null, params); } @SuppressWarnings("unchecked") @Override public Page<Object> findPurchasePage(Date beginDate, Date endDate, Pageable pageable) { String sqlString = "select o.member, sum(o.amountPaid) " + "from Order o where 1=1 "; List<Object> params = new ArrayList<Object>(); if (beginDate != null) { sqlString += " and o.createDate >= ?"; params.add(beginDate); } if (endDate != null) { sqlString += " and o.createDate <= ?"; params.add(endDate); } sqlString += " and o.orderStatus = ?"; params.add(Order.OrderStatus.completed); sqlString += " and o.paymentStatus = ?"; params.add(Order.PaymentStatus.paid); sqlString += " group by o.member.id"; sqlString += " order by sum(o.amountPaid) DESC"; Long count = count(beginDate, endDate); int i = (int) Math.ceil(count.longValue() / pageable.getPageSize()); if (i < pageable.getPageNumber()) pageable.setPageNumber(i); Query query = createQuery(sqlString, params.toArray()); query.setFirstResult((pageable.getPageNumber() - 1) * pageable.getPageSize()); query.setMaxResults(pageable.getPageSize()); List<Object> list = query.list(); if (list.size() > 0) { return new Page<Object>(query.list(), count, pageable); } List<Object> listTemp = new ArrayList<Object>(); return new Page<Object>(listTemp, count, pageable); } @Override public Page<Member> findPage(Pageable pageable) { String sqlString = "select members from Member members where 1=1 "; List<Object> parameter = new ArrayList<Object>(); return super.findPage(sqlString, parameter, pageable); } @Override public boolean usernameExists(String username) { if (username == null) return false; String str = "select count(*) from Member members where lower(members.username) = lower(:username)"; Long localLong = (Long) this.getEntityManager() .createQuery(str, Long.class) .setFlushMode(FlushModeType.COMMIT) .setParameter("username", username).getSingleResult(); return localLong.longValue() > 0L; } @Override public boolean emailExists(String email) { if (email == null) return false; String str = "select count(*) from Member members where lower(members.email) = lower(:email)"; Long localLong = (Long) this.getEntityManager() .createQuery(str, Long.class) .setFlushMode(FlushModeType.COMMIT) .setParameter("email", email).getSingleResult(); return localLong.longValue() > 0L; } @Override public Member update(Member member){ Member retMember = null; if (member != null) { retMember = this.getEntityManager().merge(member); } return retMember; } }