这段时间在开发“镁光城”项目的时候使用到了开源的Koala系统,使用过程中有不少心得,进行了整理。 下面介绍的是“扩展Koala的KoalaLegacyEntity,增强其CRUD方面的功能” 使用过程中觉得Koala的基类KoalaLegacyEntity提供的CRUD方面的功能太简单,所以对其进行了扩展。 欢迎进行拍砖。
BaseEntity是主类,扩展的CRUD方法都在这个类里面,继承这个类的实体可直接使用扩展的方法,提高开发效率。
另外,BaseEntity类使用到了两个工具类JPQLUtil和EntityUtil,下面会分别介绍。
package com.shanlan.basic.core.domain; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.dayatang.domain.Entity; import org.dayatang.domain.InstanceFactory; import org.dayatang.domain.JpqlQuery; import org.dayatang.querychannel.QueryChannelService; import org.dayatang.utils.Page; import org.openkoala.koala.commons.domain.KoalaLegacyEntity; import com.shanlan.common.util.EntityUtil; import com.shanlan.common.util.JPQLUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Created by albertliu on 14/11/25. */ public class BaseEntity extends KoalaLegacyEntity { /** * */ private static final long serialVersionUID = 6545100226409647983L; private static final Logger logger = LoggerFactory .getLogger(BaseEntity.class); protected static QueryChannelService getQueryChannelService() { QueryChannelService queryChannel = null; if (queryChannel == null) { queryChannel = InstanceFactory.getInstance( QueryChannelService.class, "queryChannel"); } return queryChannel; } /** * 获取业务主键。业务主键是判断相同类型的两个实体在业务上的等价性的依据。如果相同类型的两个 * 实体的业务主键相同,则认为两个实体是相同的,代表同一个实体。 * <p/> * 业务主键由实体的一个或多个属性组成。 * * @return 组成业务主键的属性的数组。 */ @Override public String[] businessKeys() { return new String[0]; } /** * 取得实体的Id。实体类的每个实例都必须有个唯一Id以标识自身。 实体Id必须是可序列化的。 * * @return 实体实例的 Id. */ @Override public Serializable getId() { return null; } /** * 更新一条记录中的一个属性 * * @param entityName 要更新的实体名 * @param setPropertyName 要更新的属性名 * @param setPropertyValue 要更新的属性值 * @param wherePropertyName 约束条件属性名 * @param wherePropertyValue 约束条件属性值 * @return */ public static boolean updateOneRowOneProperty(String entityName, String setPropertyName, Object setPropertyValue, String wherePropertyName, Object wherePropertyValue) { boolean result = false; if (StringUtils.isNotBlank(entityName) && StringUtils.isNotBlank(setPropertyName) && setPropertyValue != null && StringUtils.isNotBlank(wherePropertyName) && wherePropertyValue != null) { StringBuffer JPQL = JPQLUtil.updatePropertyByProperty(entityName, setPropertyName, wherePropertyName); JpqlQuery jpqlQuery = new JpqlQuery(getRepository(), JPQL.toString()); jpqlQuery.setParameters(setPropertyValue, wherePropertyValue); int updateCount = jpqlQuery.executeUpdate(); if (updateCount == 1) { result = true; } } return result; } /** * 更新多个属性 * * @param entityName 要更新的实体名 * @param setPropertyAndValueMap 要更新的属性名与值Map * @param wherePropertyName 约束条件属性名 * @param wherePropertyValue 约束条件属性值 * @return */ public static boolean update(String entityName, Map<String, Object> setPropertyAndValueMap, String wherePropertyName, Object wherePropertyValue) { if (StringUtils.isNotBlank(entityName) && MapUtils.isNotEmpty(setPropertyAndValueMap) && StringUtils.isNotBlank(wherePropertyName) && wherePropertyValue != null) { StringBuffer JPQL = JPQLUtil.updateAndSet(entityName); int i = 0; List<Object> conditionValues = new ArrayList<Object>(); for (Map.Entry<String, Object> entry : setPropertyAndValueMap .entrySet()) { String property = entry.getKey(); Object value = entry.getValue(); if (StringUtils.isBlank(property) && value == null) { continue; } i++; if (i == 1) { JPQL.append(JPQLUtil.appendEqualQuestionSign(entityName, property)); conditionValues.add(value); } else if (i > 1) { JPQL.append(JPQLUtil.appendCommaEqualQuestionSign( entityName, property)); conditionValues.add(value); } } JPQL.append(JPQLUtil.whereEntityDotPropertyNameEqualQuestionSign( entityName, wherePropertyName)); conditionValues.add(wherePropertyValue); JpqlQuery jpqlQuery = new JpqlQuery(getRepository(), JPQL.toString()); jpqlQuery.setParameters(conditionValues); int updateCount = jpqlQuery.executeUpdate(); logger.info("JPQL:'" + JPQL.toString() + "' conditionValues:'" + StringUtils.join(conditionValues, ",") + "' UpdateCount:" + updateCount); if ("id".equals(wherePropertyName)) {// 如果是根据Id更新,则只会更新一条记录 return updateCount == 1; } else { return true; } } return false; } /** * 更新实体中不为null的字段 * * @return * @throws IllegalAccessException */ public Boolean update() throws IllegalAccessException { if (this.getId() != null) { Integer id = (Integer) this.getId(); Map<String, Object> setPropertyValueMap = EntityUtil .getNotNullAndIdPropertyNameAndValueMap(this); return update(this.getClass().getSimpleName(), setPropertyValueMap, id); } else if (this.getId() == null) { throw new NullPointerException("id不能为空"); } return false; } /** * 根据Id更新多个属性 * * @param entityName 要更新的实体名 * @param setPropertyAndValueMap 要更新的属性名与值Map * @param id id的值 * @return */ public static boolean update(String entityName, Map<String, Object> setPropertyAndValueMap, Integer id) { return update(entityName, setPropertyAndValueMap, "id", id); } /** * 更新一条记录中的一个属性 * * @param entityName 要更新的实体名 * @param setPropertyName 要更新的属性名 * @param setPropertyValue 要更新的属性值 * @param id id值 * @return */ public static boolean updateOneRowOneProperty(String entityName, String setPropertyName, Object setPropertyValue, Integer id) { boolean result = false; if (StringUtils.isNotBlank(entityName) && StringUtils.isNotBlank(setPropertyName) && setPropertyValue != null && id != null) { StringBuffer JPQL = JPQLUtil.updatePropertyByProperty(entityName, setPropertyName, "id"); JpqlQuery jpqlQuery = new JpqlQuery(getRepository(), JPQL.toString()); jpqlQuery.setParameters(setPropertyValue, id); int updateCount = jpqlQuery.executeUpdate(); if (updateCount == 1) { result = true; } } return result; } /** * 根据查询条件列出实体 * * @param <T> 实体所属的类型 * @param clazz 实体所属的类 * @param wherePropertyName 条件属性名 * @param wherePropertyValues 条件属性值列表 * @return 符合条件的实体列表 */ public static <T extends Entity> List<T> list(Class<T> clazz, String wherePropertyName, Collection<?> wherePropertyValues) { List<T> entityList = new ArrayList<T>(); if (clazz != null && CollectionUtils.isNotEmpty(wherePropertyValues)) { StringBuffer JPQL = JPQLUtil.selectByPropertyIn(clazz, wherePropertyName, wherePropertyValues); entityList = getRepository().createJpqlQuery(JPQL.toString()) .list(); } return entityList; } /** * 根据查询条件列出实体 * * @param <T> 实体所属的类型 * @param clazz 实体所属的类 * @param wherePropertyName2 条件属性名 * @param wherePropertyValues2 条件属性值列表 * @return 符合条件的实体列表 */ public static <T extends Entity> List<T> list(Class<T> clazz, String wherePropertyName1, Object wherePropertyValue1, String wherePropertyName2, Collection<?> wherePropertyValues2) { List<T> entityList = new ArrayList<T>(); String entityName = clazz.getSimpleName(); StringBuffer JPQL = JPQLUtil.selectEntity(entityName); JPQL.append(JPQLUtil.fromEntity(entityName)); JPQL.append(JPQLUtil.whereIdentity()); List<Object> conditionValues = new ArrayList<Object>(); if (StringUtils.isNotBlank(wherePropertyName1) && wherePropertyValue1 != null) { JPQL.append(JPQLUtil.andPropertyEqualQuestionSign(entityName, wherePropertyName1)); conditionValues.add(wherePropertyValue1); } if (StringUtils.isNotBlank(wherePropertyName2) && CollectionUtils.isNotEmpty(wherePropertyValues2)) { JPQL.append(JPQLUtil.andPropertyIn(entityName, wherePropertyName2, wherePropertyValues2)); } entityList = getRepository().createJpqlQuery(JPQL.toString()) .setParameters(conditionValues).list(); return entityList; } /** * 根据查询条件列出自关联的实体,JQPL语句形如: Select entityB From entity As entityA,entity As * entityB Where * entityA.entityNameARePropertyName=entityB.entityNameBRePropertyName And * entityA.entityAWherePropertyName1=entityAWherePropertyValue1 And * entityA.entityAWherePropertyName2 In (entityAWherePropertyValues2) * * @param <T> 实体所属的类型 * @param clazz 实体所属的类 * @param entityNameARePropertyName 进行自关联的属性名 * @param entityNameBRePropertyName 进行自关联的属性名 * @param entityAWherePropertyName1 entityB条件属性名 * @param entityAWherePropertyValue1 entityB条件属性值列表 * @param entityAWherePropertyName2 entityB条件属性名 * @param entityAWherePropertyValues2 entityB条件属性值列表 * @return 符合条件的实体列表 */ public static <T extends Entity> List<T> listSelfRelation(Class<T> clazz, String entityNameARePropertyName, String entityNameBRePropertyName, String entityAWherePropertyName1, Object entityAWherePropertyValue1, String entityAWherePropertyName2, Collection<?> entityAWherePropertyValues2) { List<T> entityList = new ArrayList<T>(); String entityNameA = EntityUtil.getEntityNameAppendA(clazz); String entityNameB = EntityUtil.getEntityNameAppendB(clazz); StringBuffer JPQL = JPQLUtil.selectEntity(entityNameB); JPQL.append(JPQLUtil.fromTowEntities(clazz)); JPQL.append(JPQLUtil.whereIdentity()); if (StringUtils.isNotBlank(entityNameARePropertyName) && StringUtils.isNotBlank(entityNameBRePropertyName)) { JPQL.append(JPQLUtil.andTwoEntityRelation(entityNameA, entityNameARePropertyName, entityNameB, entityNameBRePropertyName)); } List<Object> conditionValues = new ArrayList<Object>(); if (StringUtils.isNotBlank(entityAWherePropertyName1) && entityAWherePropertyValue1 != null) { JPQL.append(JPQLUtil.andPropertyEqualQuestionSign(entityNameA, entityAWherePropertyName1)); conditionValues.add(entityAWherePropertyValue1); } if (StringUtils.isNotBlank(entityAWherePropertyName2) && CollectionUtils.isNotEmpty(entityAWherePropertyValues2)) { JPQL.append(JPQLUtil.andPropertyIn(entityNameA, entityAWherePropertyName2, entityAWherePropertyValues2)); } entityList = getRepository().createJpqlQuery(JPQL.toString()) .setParameters(conditionValues).list(); return entityList; } /** * 根据查询条件列出自关联的实体,JQPL语句形如: Select entityB From entity As entityA,entity As * entityB Where * entityA.entityNameARePropertyName=entityB.entityNameBRePropertyName And * entityA.entityAWherePropertyName1=entityAWherePropertyValue1 * * @param <T> 实体所属的类型 * @param clazz 实体所属的类 * @param entityAWherePropertyName entityB条件属性名 * @param entityAWherePropertyValue entityB条件属性值列 * @return 符合条件的实体列表 */ public static <T extends Entity> List<T> listSelfRelation(Class<T> clazz, String entityNameARePropertyName, String entityNameBRePropertyName, String entityAWherePropertyName, Object entityAWherePropertyValue) { return listSelfRelation(clazz, entityNameARePropertyName, entityNameBRePropertyName, entityAWherePropertyName, entityAWherePropertyValue, null, null); } /** * 根据id列表列出实体 * * @param <T> 实体所属的类型 * @param clazz 实体所属的类 * @param ids id列表 * @return 符合条件的实体列表 */ public static <T extends Entity> List<T> list(Class<T> clazz, Collection<?> ids) { List<T> entityList = new ArrayList<T>(); if (clazz != null && CollectionUtils.isNotEmpty(ids)) { StringBuffer JPQL = JPQLUtil.selectByPropertyIn(clazz, "id", ids); entityList = getRepository().createJpqlQuery(JPQL.toString()) .list(); } return entityList; } /** * @param <T> 实体所属的类型 * @param clazz 实体所属的类 * @param wherePropertyName 条件属性名 * @param wherePropertyValues 条件属性值列表 * @return 符合条件的Id与实体自身的HashMap */ public static <T extends Entity> Map<Integer, T> getIdAndSelfMap( Class<T> clazz, String wherePropertyName, List<?> wherePropertyValues) { Map<Integer, T> idAndSelfMap = new HashMap<Integer, T>(); List<T> entityList = list(clazz, wherePropertyName, wherePropertyValues); for (T entity : entityList) { idAndSelfMap.put((Integer) entity.getId(), entity); } return idAndSelfMap; } /** * 分页查询实体 * * @param <T> 实体所属的类型 * @param clazz 实体所属的类 * @param wherePropertyName 条件属性名 * @param wherePropertyValue 条件属性值 * @param pageIndex 当前页 * @param pageSize 每页显示的数据量 * @param orderByPropertyName 进行排序的属性名,为null则不排序 * @param isDESC 是否按倒序排列,为null或false按升序排序 * @return 符合条件的实体列表 */ public static <T extends Entity> Page<T> page(Class<T> clazz, int pageIndex, int pageSize, String wherePropertyName, Object wherePropertyValue, String orderByPropertyName, Boolean isDESC) { return page(clazz, wherePropertyName, wherePropertyValue, null, null, pageIndex, pageSize, orderByPropertyName, isDESC); } /** * 分页查询实体 * * @param <T> 实体所属的类型 * @param clazz 实体所属的类 * @param wherePropertyName 条件属性名 * @param wherePropertyValues 条件属性值列表 * @param pageIndex 当前页 * @param pageSize 每页显示的数据量 * @param orderByPropertyName 进行排序的属性名,为null则不排序 * @param isDESC 是否按倒序排列,为null或false按升序排序 * @return 符合条件的实体列表 */ public static <T extends Entity> Page<T> page(Class<T> clazz, String wherePropertyName, Collection<?> wherePropertyValues, int pageIndex, int pageSize, String orderByPropertyName, Boolean isDESC) { Page<T> entityPage = new Page<T>(0, 0, pageSize, new ArrayList<T>()); String entityName = EntityUtil.getEntityName(clazz); StringBuffer JPQL = JPQLUtil.selectByPropertyIn(entityName, wherePropertyName, wherePropertyValues); if (StringUtils.isNotBlank(JPQL) && CollectionUtils.isNotEmpty(wherePropertyValues)) { if (StringUtils.isNotBlank(orderByPropertyName)) { JPQL.append(JPQLUtil.orderBy(entityName, orderByPropertyName)); if (isDESC != null && isDESC) { JPQL.append(JPQLUtil.orderDESC()); } } entityPage = getQueryChannelService() .createJpqlQuery(JPQL.toString()) .setPage(pageIndex, pageSize).pagedList(); } return entityPage; } /** * 分页查询实体 * * @param <T> 实体所属的类型 * @param clazz 实体所属的类 * @param wherePropertyName1 条件1属性名 * @param wherePropertyValue1 条件1属性值列表 * @param wherePropertyName2 条件2属性名 * @param wherePropertyValues2 条件2属性值列表 * @param pageIndex 当前页 * @param pageSize 每页显示的数据量 * @param orderByPropertyName 进行排序的属性名,为null则不排序 * @param isDESC 是否按倒序排列,为null或false按升序排序 * @return 符合条件的实体列表 */ public static <T extends Entity> Page<T> page(Class<T> clazz, String wherePropertyName1, Object wherePropertyValue1, String wherePropertyName2, Collection<?> wherePropertyValues2, int pageIndex, int pageSize, String orderByPropertyName, Boolean isDESC) { Page<T> entityPage = new Page<T>(0, 0, pageSize, new ArrayList<T>()); String entityName = EntityUtil.getEntityName(clazz); StringBuffer JPQL = JPQLUtil.selectEntity(entityName); JPQL.append(JPQLUtil.fromEntity(entityName)); JPQL.append(JPQLUtil.whereIdentity()); List<Object> conditionValues = new ArrayList<Object>(); if (StringUtils.isNotBlank(wherePropertyName1) && wherePropertyValue1 != null) { JPQL.append(JPQLUtil.andPropertyEqualQuestionSign(entityName, wherePropertyName1)); conditionValues.add(wherePropertyValue1); } if (StringUtils.isNotBlank(wherePropertyName2) && CollectionUtils.isNotEmpty(wherePropertyValues2)) { JPQL.append(JPQLUtil.andPropertyIn(entityName, wherePropertyName2, wherePropertyValues2)); } if (StringUtils.isNotBlank(orderByPropertyName)) { JPQL.append(JPQLUtil.orderBy(entityName, orderByPropertyName)); if (isDESC != null && isDESC) { JPQL.append(JPQLUtil.orderDESC()); } } entityPage = getQueryChannelService().createJpqlQuery(JPQL.toString()) .setParameters(conditionValues).setPage(pageIndex, pageSize) .pagedList(); return entityPage; } /** * 执行 Delete From entityName where propertyName In (propertyValues) * 这种类型的删除语句 * * @param entityName * @param propertyName * @param propertyValue * @return */ public static boolean delete(String entityName, String propertyName, Object propertyValue) { if (propertyValue != null) { StringBuffer JPQL = JPQLUtil.deleteByProperty(entityName, propertyName); JpqlQuery jpqlQuery = new JpqlQuery(getRepository(), JPQL.toString()); jpqlQuery.setParameters(propertyValue); int deleteCount = jpqlQuery.executeUpdate(); logger.info("JPQL:'" + JPQL.toString() + "' propertyValue1:'" + propertyValue + "' DeleteCount:" + deleteCount); return true; } return false; } /** * 执行 Delete From entityName where propertyName = ? 这种类型的删除语句 * * @param clazz * @param propertyName * @param propertyValue * @return */ public static boolean delete(Class clazz, String propertyName, Object propertyValue) { if (clazz != null && propertyValue != null) { String entityName = clazz.getSimpleName(); StringBuffer JPQL = JPQLUtil.deleteByProperty(entityName, propertyName); JpqlQuery jpqlQuery = new JpqlQuery(getRepository(), JPQL.toString()); jpqlQuery.setParameters(propertyValue); int deleteCount = jpqlQuery.executeUpdate(); logger.info("JPQL:'" + JPQL.toString() + "' propertyValue1:'" + propertyValue + "' DeleteCount:" + deleteCount); return true; } return false; } /** * 执行 Delete From entityName where propertyName In (propertyValues) * 这种类型的删除语句 * * @param entityName * @param propertyName * @param propertyValues * @return */ public static boolean delete(String entityName, String propertyName, Collection<?> propertyValues) { if (CollectionUtils.isNotEmpty(propertyValues)) { StringBuffer JPQL = JPQLUtil.deleteByPropertyIn(entityName, propertyName, propertyValues); JpqlQuery jpqlQuery = new JpqlQuery(getRepository(), JPQL.toString()); int deleteCount = jpqlQuery.executeUpdate(); logger.info("JPQL:'" + JPQL.toString() + "' DeleteCount:" + deleteCount); if (deleteCount == propertyValues.size()) { return true; } } return false; } /** * 执行 Delete From entityName where propertyName In (propertyValues) * 这种类型的删除语句 * * @param entityName * @param propertyName1 * @param propertyValue1 * @param propertyName2 * @param propertyValues2 * @return */ public static boolean delete(String entityName, String propertyName1, Object propertyValue1, String propertyName2, Collection<?> propertyValues2) { if ((StringUtils.isNotBlank(propertyName1) && StringUtils .isNotBlank(propertyName2)) && (propertyValue1 != null || CollectionUtils .isNotEmpty(propertyValues2))) { StringBuffer JPQL = JPQLUtil.deleteByProperty(entityName, propertyName1); JPQL.append(JPQLUtil.andPropertyIn(entityName, propertyName2, propertyValues2)); JpqlQuery jpqlQuery = new JpqlQuery(getRepository(), JPQL.toString()); jpqlQuery.setParameters(propertyValue1); int deleteCount = jpqlQuery.executeUpdate(); logger.info("JPQL:'" + JPQL.toString() + "' propertyValue1:'" + propertyValue1 + "' DeleteCount:" + deleteCount); return true; } return false; } /** * 执行 Delete From entityName where propertyName In (propertyValues) * 这种类型的删除语句 * * @param clazz * @param propertyName1 * @param propertyValue1 * @param propertyName2 * @param propertyValues2 * @return */ public static boolean delete(Class clazz, String propertyName1, Object propertyValue1, String propertyName2, Collection<?> propertyValues2) { if ((StringUtils.isNotBlank(propertyName1) && StringUtils .isNotBlank(propertyName2)) && (propertyValue1 != null || CollectionUtils .isNotEmpty(propertyValues2))) { String entityName = clazz.getSimpleName(); StringBuffer JPQL = JPQLUtil.deleteByProperty(entityName, propertyName1); JPQL.append(JPQLUtil.andPropertyIn(entityName, propertyName2, propertyValues2)); JpqlQuery jpqlQuery = new JpqlQuery(getRepository(), JPQL.toString()); jpqlQuery.setParameters(propertyValue1); int deleteCount = jpqlQuery.executeUpdate(); logger.info("JPQL:'" + JPQL.toString() + "' propertyValue1:'" + propertyValue1 + "' DeleteCount:" + deleteCount); return true; } return false; } /** * 执行 Delete From entityName where id In (ids) 这种类型的删除语句 * * @param entityName * @param ids * @return */ public static boolean delete(String entityName, Collection<Integer> ids) { return delete(entityName, "id", ids); } /** * 执行 Delete From entityName where propertyName In (propertyValues) * 这种类型的删除语句 * * @param clazz 实体所属的类 * @param propertyName 属性名 * @param propertyValues 属性值列表 * @return */ public static boolean delete(Class clazz, String propertyName, Collection<?> propertyValues) { return delete(clazz.getSimpleName(), propertyName, propertyValues); } /** * 执行 Delete From entityName where id In (ids) 这种类型的删除语句 * * @param clazz 实体所属的类 * @param ids id列表 * @return */ public static boolean delete(Class clazz, Collection<Integer> ids) { return delete(clazz.getSimpleName(), "id", ids); } }
package com.shanlan.common.util; import java.util.List; import org.apache.commons.lang3.StringUtils; /** * Created by albertliu on 14-10-20. */ public class JPQLUtil { /** * 得到形如select xx from xx where xxx =?的Sql语句 * * @param entityName * @param wherePropertyName * @return */ public static StringBuffer selectByProperty(String entityName, String wherePropertyName) { StringBuffer JPQL = new StringBuffer(); if (StringUtils.isNotBlank(entityName) && StringUtils.isNotBlank(wherePropertyName)) { JPQL.append(selectEntity(entityName)); JPQL.append(fromEntity(entityName)); JPQL.append(whereEntityDotPropertyNameEqualQuestionSign(entityName, wherePropertyName)); } return JPQL; } /** * 得到形如select xx from xx where xxx in()的Sql语句 * * @param clazz * @param propertyName * @param propertyValues * @return */ public static StringBuffer selectByPropertyIn(Class clazz, String propertyName, Iterable<?> propertyValues) { StringBuffer JPQL = new StringBuffer(); if (clazz != null && propertyValues != null) { String entityName = clazz.getSimpleName(); JPQL.append(selectEntity(entityName)); JPQL.append(fromEntity(entityName)); JPQL.append(whereEntityDotPropertyNameInValue(entityName, propertyName, propertyValues)); } return JPQL; } /** * 得到形如select xx from xx where xxx in()的Sql语句 * * @param entityName * @param wherePropertyName * @param wherePropertyValues * @return */ public static StringBuffer selectByPropertyIn(String entityName, String wherePropertyName, Iterable<?> wherePropertyValues) { StringBuffer JPQL = new StringBuffer(); if (StringUtils.isNotBlank(entityName) && StringUtils.isNotBlank(wherePropertyName) && wherePropertyValues != null) { JPQL.append(selectEntity(entityName)); JPQL.append(fromEntity(entityName)); JPQL.append(whereEntityDotPropertyNameInValue(entityName, wherePropertyName, wherePropertyValues)); } return JPQL; } /** * 得到形如select xx from xx where xxx not in()的Sql语句 * * @param clazz * @param propertyName * @param propertyValues * @return */ public static StringBuffer selectByPropertyNotIn(Class clazz, String propertyName, java.lang.Iterable<?> propertyValues) { StringBuffer JPQL = new StringBuffer(); if (clazz != null && propertyValues != null && StringUtils.isNotBlank(propertyName)) { String entityName = clazz.getSimpleName(); JPQL.append("Select " + entityName); JPQL.append(" From " + entityName + " " + entityName); JPQL.append(" Where " + propertyName + " Not In ('" + StringUtils.join(propertyValues, "','") + "')"); } return JPQL; } public static StringBuffer selectEntity(Class clazz) { StringBuffer JPQL = new StringBuffer(); if (clazz != null) { JPQL.append("Select " + clazz.getSimpleName()); } return JPQL; } public static StringBuffer selectEntity(String entityName) { StringBuffer JPQL = new StringBuffer(); if (StringUtils.isNotBlank(entityName)) { JPQL.append("Select " + entityName + " "); } return JPQL; } /** * 返回形如 Delete From xxx As xxx这种类型的StringBuffer * * @param entityName * @return */ public static StringBuffer deleteEntity(String entityName) { StringBuffer JPQL = new StringBuffer(); if (StringUtils.isNotBlank(entityName)) { JPQL.append("Delete From " + EntityUtil.getEntityNameAndAlias(entityName) + " "); } return JPQL; } public static String fromEntity(String entity) { return " From " + entity + " As " + entity; } /** * 返回形如 Select entity From entity as entity * * @param entityName * @return */ public static StringBuffer selectEntityFromEntity(String entityName) { StringBuffer JPQL = selectEntity(entityName); JPQL.append(fromEntity(entityName)); return JPQL; } /** * 返回形如 From EntityA As EntityA,EntityB As EntityB 这样的字符串 * * @param entity1 * @param entity2 * @return */ public static String fromTowEntities(String entity1, String entity2) { return fromEntity(entity1) + " , " + entity2 + " As " + entity2; } /** * 返回形如 From Entity As EntityA,Entity As EntityB 这样的字符串 * * @param entity1 * @param entity2 * @return */ public static String fromTowEntities(String entityName, String entityNameA, String entityNameB) { return entityName + " As " + entityNameA + " , " + entityName + " As " + entityNameB; } /** * 返回形如 From Entity As EntityA,Entity As EntityB 这样的字符串 * * @param entity1 * @param entity2 * @return */ public static String fromTowEntities(Class clazz, String entityNameA, String entityNameB) { String entityName = EntityUtil.getEntityName(clazz); return entityName + " As " + entityNameA + " , " + entityName + " As " + entityNameB; } /** * 返回形如 From Entity As EntityA,Entity As EntityB 这样的字符串 * * @param entity1 * @param entity2 * @return */ public static String fromTowEntities(Class clazz) { String entityName = EntityUtil.getEntityName(clazz); return " From "+entityName + " As " + EntityUtil.getEntityNameAppendA(clazz) + " , " + entityName + " As " + EntityUtil.getEntityNameAppendB(clazz); } /** * 返回形如 From EntityA As EntityA 这样的字符串 * * @param clazz * @return */ public static String fromEntity(Class clazz) { return " From " + EntityUtil.getEntityNameAndAlias(clazz); } /** * 返回形如 From EntityA As EntityA,EntityB As EntityB 这样的字符串 * * @param clazz1 * @param clazz2 * @return */ public static String fromTowEntities(Class clazz1, Class clazz2) { return fromEntity(clazz1) + " , " + EntityUtil.getEntityNameAndAlias(clazz2); } /** * 返回形如 Update EntityA As EntityA 这样的字符串 * * @param clazz * @return */ public static StringBuffer update(Class clazz) { StringBuffer JPQL = new StringBuffer(); JPQL.append("Update "); JPQL.append(EntityUtil.getEntityNameAndAlias(clazz)); return JPQL; } /** * 返回形如 Update EntityA As EntityA Set 这样的字符串 * * @param clazz * @return */ public static StringBuffer updateAndSet(Class clazz) { StringBuffer JPQL = new StringBuffer(); JPQL.append("Update "); JPQL.append(EntityUtil.getEntityNameAndAlias(clazz)); JPQL.append(" Set "); return JPQL; } /** * 返回形如 Update EntityA As EntityA Set 这样的字符串 * * @param entityName * @return */ public static StringBuffer updateAndSet(String entityName) { StringBuffer JPQL = new StringBuffer(); JPQL.append("Update "); JPQL.append(EntityUtil.getEntityNameAndAlias(entityName)); JPQL.append(" Set "); return JPQL; } /** * 返回形如 Update EntityA As EntityA 这样的字符串 * * @param entityName * @return */ public static StringBuffer update(String entityName) { StringBuffer JPQL = new StringBuffer(); JPQL.append("Update "); JPQL.append(EntityUtil.getEntityNameAndAlias(entityName)); return JPQL; } /** * @param clazz * @param propertyName * @param columnValue * @param id * @return */ public static StringBuffer updatePropertyById(Class clazz, String propertyName, String columnValue, Integer id) { StringBuffer JPQL = new StringBuffer(); if (clazz != null && StringUtils.isNotBlank(propertyName)) { String entityName = clazz.getSimpleName(); JPQL.append("Update " + entityName + " " + entityName); JPQL.append(" Set " + propertyName + "='" + columnValue + "'"); JPQL.append(" Where id='" + id + "'"); } return JPQL; } /** * 返回形如 Update entity AS entity set setPropertyName=? Where * wherePropertyName=? 这种类型的JPQL语句 * * @param clazz * @param setPropertyName * @param wherePropertyName * @return */ public static StringBuffer updatePropertyByProperty(Class clazz, String setPropertyName, String wherePropertyName) { StringBuffer JPQL = new StringBuffer(); if (clazz != null && StringUtils.isNotBlank(setPropertyName) && StringUtils.isNotBlank(wherePropertyName)) { String entityName = EntityUtil.getEntityName(clazz); JPQL = update(entityName); JPQL.append(setEqualQuestionSign(entityName, setPropertyName)); JPQL.append(whereEntityDotPropertyNameEqualQuestionSign(entityName, wherePropertyName)); } return JPQL; } /** * 返回形如 Update entity AS entity set setPropertyName=? Where * wherePropertyName=? 这种类型的JPQL语句 * * @param entityName * @param setPropertyName * @param wherePropertyName * @return */ public static StringBuffer updatePropertyByProperty(String entityName, String setPropertyName, String wherePropertyName) { StringBuffer JPQL = new StringBuffer(); if (StringUtils.isNotBlank(entityName) && StringUtils.isNotBlank(setPropertyName) && StringUtils.isNotBlank(wherePropertyName)) { JPQL = update(entityName); JPQL.append(setEqualQuestionSign(entityName, setPropertyName)); JPQL.append(whereEntityDotPropertyNameEqualQuestionSign(entityName, wherePropertyName)); } return JPQL; } /** * 得到形如select xx from xx where id in()的Sql语句 * * @param clazz * @param ids * @return */ public static StringBuffer selectByIdIn(Class clazz, List<Integer> ids) { return selectByPropertyIn(clazz, "id", ids); } /** * 得到形如select xx from xx where id in()的Sql语句 * * @param entityName * @param ids * @return */ public static StringBuffer selectByIdIn(String entityName, List<Integer> ids) { return selectByPropertyIn(entityName, "id", ids); } /** * 得到形如select xx from xx where id not in()的Sql语句 * * @param clazz * @param ids * @return */ public static StringBuffer selectByIdNotIn(Class clazz, List<Integer> ids) { return selectByPropertyNotIn(clazz, "id", ids); } /** * 在属性名后添加= ? 符号,比如属性名address的返回值会是 Entity.address= ? * * @param propertyName * @return */ public static String appendEqualQuestionSign(String entityName, String propertyName) { return getEntityDotPropertyNameEqual(entityName, propertyName) + "? "; } /** * 在属性名后添加 , Entity.property= ? 符号,比如属性名address的返回值会是 , Entity.address= ? * * @param entityName * @param propertyName * @return */ public static String appendCommaEqualQuestionSign(String entityName, String propertyName) { return ", " + getEntityDotPropertyNameEqual(entityName, propertyName) + "? "; } /** * 在属性名前添加And,在其后添加= ? 符号,比如属性名address的返回值会是And address= ? * * @param propertyName * @return */ public static String andPropertyEqualQuestionSign(String entityName, String propertyName) { return " And " + getEntityDotPropertyNameEqual(entityName, propertyName) + "? "; } /** * 在属性名前添加And,在其后添加!= ? 符号,比如属性名address的返回值会是And address!= ? * * @param propertyName * @return */ public static String andPropertyNotEqualQuestionSign(String entityName, String propertyName) { return " And " + getEntityDotPropertyNameNotEqual(entityName, propertyName) + "? "; } /** * 在属性名前添加Set,在其后添加= ? 符号,比如属性名address的返回值会是Set address= ? * * @param propertyName * @return */ public static String setEqualQuestionSign(String entityName, String propertyName) { return " Set " + entityName + "." + propertyName + "= ? "; } /** * 获取形如 Where entity.property=? 类型的字符串 * * @param entityName * @param propertyName * @return */ public static String whereEntityDotPropertyNameEqualQuestionSign( String entityName, String propertyName) { return " Where " + getEntityDotPropertyNameEqual(entityName, propertyName) + "? "; } /** * 在属性名后添加 like ? 符号,比如属性名address的返回值会是address like ? * * @param propertyName * @return */ public static String andPropertyLikeQuestionSign(String entityName, String propertyName) { return " And " + getEntityDotPropertyName(entityName, propertyName) + " Like ? "; } /** * 在属性名后添加 In() 符号,比如属性名address的返回值会是address In ('XX','XX') * * @param propertyName * @return */ public static String andPropertyIn(String entityName, String propertyName, Iterable<?> propertyValues) { return " And " + getEntityDotPropertyName(entityName, propertyName) + " In ('" + StringUtils.join(propertyValues, "','") + "')"; } /** * 在属性名前添加And,在其后添加 Not In() 符号,比如属性名address的返回值会是 And address Not In * ('XX','XX') * * @param propertyName * @return */ public static String andPropertyNotIn(String entityName, String propertyName, Iterable<?> propertyValues) { return " And " + getEntityDotPropertyName(entityName, propertyName) + " Not In ('" + StringUtils.join(propertyValues, "','") + "')"; } /** * 在属性名后添加>= ? 符号,比如属性名address的返回值会是address>= ? * * @param propertyName * @return */ public static String andPropertyGreaterEqualQuestionSign(String entityName, String propertyName) { return " And " + getEntityDotPropertyName(entityName, propertyName) + ">= ? "; } /** * 在属性名后添加<= ? 符号,比如属性名address的返回值会是address<= ? * * @param propertyName * @return */ public static String andPropertyLessEqualQuestionSign(String entityName, String propertyName) { return " And " + getEntityDotPropertyName(entityName, propertyName) + "<= ? "; } /** * 关联两个实体,即返回形如 And entity1.property1=entity2.property2 * * @param entityName1 * @param propertyName1 * @param entityName2 * @param propertyName2 * @return */ public static String andTwoEntityRelation(String entityName1, String propertyName1, String entityName2, String propertyName2) { return " And " + getEntityDotPropertyNameEqual(entityName1, propertyName1) + getEntityDotPropertyName(entityName2, propertyName2); } /** * 获取形如 UserDetail.userName 这种类型的字符串 * * @param entityName * @param propertyName * @return */ public static String getEntityDotPropertyName(String entityName, String propertyName) { return " " + entityName + "." + propertyName + " "; } /** * 获取形如 UserDetail.userName= 这种类型的字符串 * * @param entityName * @param propertyName * @return */ public static String getEntityDotPropertyNameEqual(String entityName, String propertyName) { return " " + entityName + "." + propertyName + "="; } /** * 获取形如 UserDetail.userName!= 这种类型的字符串 * * @param entityName * @param propertyName * @return */ public static String getEntityDotPropertyNameNotEqual(String entityName, String propertyName) { return " " + entityName + "." + propertyName + "!="; } /** * 获取形如 UserDetail.userName, 这种类型的字符串 * * @param entityName * @param propertyName * @return */ public static String getEntityDotPropertyNameComma(String entityName, String propertyName) { return " " + entityName + "." + propertyName + ", "; } /** * 获取形如 UserDetail.userName= 这种类型的字符串 * * @param entityName * @param propertyName * @return */ public static String whereEntityDotPropertyNameEqual(String entityName, String propertyName) { return " Where " + entityName + "." + propertyName + "="; } // /** // * 获取形如 UserDetail.userName=? 这种类型的字符串 // * // * @param entityName // * @param propertyName // * @return // */ // public static String whereEntityDotPropertyNameEqualQuestionSign( // String entityName, String propertyName) { // return " Where" + entityName + "." + propertyName + "=?"; // } /** * 获取形如 UserDetail.userName='XX' 这种类型的字符串 * * @param entityName * @param propertyName * @return */ public static String whereEntityDotPropertyNameEqualValue( String entityName, String propertyName, String propertyValue) { return " Where" + getEntityDotPropertyNameEqual(entityName, propertyName) + StringUtil.wrapSingleQuotes(propertyValue); } /** * 在属性名后添加 In() 符号,比如属性名address的返回值会是address In ('XX','XX') * * @param propertyName * @return */ public static String whereEntityDotPropertyNameInValue(String entityName, String propertyName, Iterable<?> propertyValues) { return " Where " + getEntityDotPropertyName(entityName, propertyName) + " In ('" + StringUtils.join(propertyValues, "','") + "')"; } /** * 返回形如 Where property Not In ('') 这种类型的语句 * * @param propertyName * @return */ public static String whereEntityDotPropertyNameNotInValue( String entityName, String propertyName, Iterable<?> propertyValues) { return " Where " + getEntityDotPropertyName(entityName, propertyName) + "Not In ('" + StringUtils.join(propertyValues, "','") + "')"; } /** * 获取形如 Select UserDetail.userName 这种类型的字符串 * * @param entityName * @param propertyName * @return */ public static String selectEntityDotPropertyName(String entityName, String propertyName) { return "Select " + getEntityDotPropertyName(entityName, propertyName) + " "; } /** * 获取形如 Select Distinct UserDetail.userName 这种类型的字符串 * * @param entityName * @param propertyName * @return */ public static String selectDistinctEntityDotPropertyName(String entityName, String propertyName) { return "Select Distinct" + getEntityDotPropertyName(entityName, propertyName) + " "; } /** * 获取形如 Select UserDetail.userName, 这种类型的字符串 * * @param entityName * @param propertyName * @return */ public static String selectEntityDotPropertyNameComma(String entityName, String propertyName) { return "Select " + getEntityDotPropertyNameComma(entityName, propertyName); } /** * 关联两个实体,即返回形如 Where entity1.property1=entity2.property2 * * @param entityName1 * @param propertyName1 * @param entityName2 * @param propertyName2 * @return */ public static String whereTwoEntityRelation(String entityName1, String propertyName1, String entityName2, String propertyName2) { return whereEntityDotPropertyNameEqual(entityName1, propertyName1) + getEntityDotPropertyName(entityName2, propertyName2); } /** * 返回 Where 1=1 这样的恒等式 * * @return */ public static String whereIdentity() { return " Where 1=1 "; } /** * 获取形如 Or entity.property=? 类型的字符串 * * @param entityName * @param propertyName * @return */ public static String orEntityDotPropertyNameEqualQuestionSign( String entityName, String propertyName) { return " Or " + getEntityDotPropertyNameEqual(entityName, propertyName) + "? "; } /** * 获取形如 Order By entity.property 类型的字符串 * * @param entityName * @param orderByPropertyName * @return */ public static String orderBy(String entityName, String orderByPropertyName) { return " Order By " + getEntityDotPropertyName(entityName, orderByPropertyName); } public static String orderDESC() { return " DESC "; } /** * 获取形如 Group By entity.property 类型的字符串 * * @param entityName * @param propertyName * @return */ public static String groupBy(String entityName, String propertyName) { return " Group By " + getEntityDotPropertyName(entityName, propertyName); } /** * 得到形如 Delete from xx where xxx in()的Sql语句 * * @param entityName * @param wherePropertyName * @param wherePropertyValues * @return */ public static StringBuffer deleteByPropertyIn(String entityName, String wherePropertyName, Iterable<?> wherePropertyValues) { StringBuffer JPQL = new StringBuffer(); if (StringUtils.isNotBlank(entityName) && StringUtils.isNotBlank(wherePropertyName) && wherePropertyValues != null) { JPQL.append(deleteEntity(entityName)); JPQL.append(whereEntityDotPropertyNameInValue(entityName, wherePropertyName, wherePropertyValues)); } return JPQL; } /** * 得到形如 Delete from xx where xxx =?的Sql语句 * * @param entityName * @param wherePropertyName * @return */ public static StringBuffer deleteByProperty(String entityName, String wherePropertyName) { StringBuffer JPQL = new StringBuffer(); if (StringUtils.isNotBlank(entityName) && StringUtils.isNotBlank(wherePropertyName)) { JPQL.append(deleteEntity(entityName)); JPQL.append(whereEntityDotPropertyNameEqualQuestionSign(entityName, wherePropertyName)); } return JPQL; } /** * 得到形如 Delete from xx where id in()的Sql语句 * * @param entityName * @param wherePropertyValues * @return */ public static StringBuffer deleteByIdIn(String entityName, Iterable<?> wherePropertyValues) { return deleteByPropertyIn(entityName, "id", wherePropertyValues); } }
package com.shanlan.common.util; import org.openkoala.koala.commons.domain.KoalaLegacyEntity; import javax.persistence.Column; import javax.persistence.Table; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by albertliu on 14-10-20. */ public class EntityUtil { public static String getAllPropertyNameOfEntity(Class clazz) { if (clazz.isAnnotationPresent(Table.class)) { Table table = (Table) clazz.getAnnotation(Table.class); String tableName = table.name(); Field[] fields = clazz.getDeclaredFields(); StringBuffer allColumnName = new StringBuffer(); for (Field field : fields) { if (field.isAnnotationPresent(Column.class)) { Column column = field.getAnnotation(Column.class); String columnName = column.name(); allColumnName.append(tableName + "." + columnName + ","); } } if (allColumnName.length() > 0) { return allColumnName.toString().substring(0, allColumnName.length() - 1); } } return null; } public static String getEntityName(Class clazz) { return clazz.getSimpleName(); } /** * 返回EntityName_A格式的实体名,比如实体是Goods,则返回Goods_A * 主要用于自己关联自己的查询 * * @param clazz * @return */ public static String getEntityNameAppendA(Class clazz) { return getEntityNameAppendA(getEntityName(clazz)); } /** * 返回EntityName_B格式的实体名,比如实体是Goods,则返回Goods_B * 主要用于自己关联自己的查询 * * @param clazz * @return */ public static String getEntityNameAppendB(Class clazz) { return getEntityNameAppendB(getEntityName(clazz)); } /** * 返回EntityName_A格式的实体名,比如实体是Goods,则返回Goods_A * 主要用于自己关联自己的查询 * * @param entityName * @return */ public static String getEntityNameAppendA(String entityName) { return entityName + "_A"; } /** * 返回EntityName_B格式的实体名,比如实体是Goods,则返回Goods_B * 主要用于自己关联自己的查询 * * @param entityName * @return */ public static String getEntityNameAppendB(String entityName) { return entityName + "_B"; } /** * 返回实体名及其Id,用于拼装JQPL语句,返回形式为entity.id,比如Goods.id. * * @param clazz * @return */ public static String getEntityNameAndId(Class clazz) { String entityName = clazz.getSimpleName(); return entityName + ".id"; } public static String getEntityNameAndAlias(Class clazz) { String entityName = clazz.getSimpleName(); return entityName + " As " + entityName; } public static String getEntityNameAndAlias(String entityName) { return entityName + " As " + entityName; } public static <T extends KoalaLegacyEntity> List<Integer> getIds(List<T> entityList) { List<Integer> ids = new ArrayList<Integer>(); if (entityList != null && entityList.size() > 0) { for (T entity : entityList) { ids.add((Integer) entity.getId()); } } return ids; } public static <T extends KoalaLegacyEntity> Map<Integer, T> getIdAndEntityMap(List<T> entityList) { Map<Integer, T> idAndEntityMap = new HashMap<Integer, T>(); if (entityList != null && entityList.size() > 0) { for (T entity : entityList) { idAndEntityMap.put((Integer) entity.getId(), entity); } } return idAndEntityMap; } /** * 获取实体字段与值映射,不包括值为空的字段 * * @param object * @return * @throws IllegalAccessException */ public static Map<String, Object> getNotNullPropertyNameAndValueMap(Object object) throws IllegalAccessException { Map<String, Object> paramValueMap = new HashMap<String, Object>(); if (object != null) { Field[] fields = object.getClass().getDeclaredFields(); for (Field field : fields) { if (field.isAnnotationPresent(Column.class)) { field.setAccessible(true); String fieldName = field.getName(); Object fieldValue = field.get(object); if (fieldValue != null) { paramValueMap.put(fieldName, fieldValue); } } } } return paramValueMap; } /** * 获取实体字段与值映射,不包括空值并且不包括id字段 * * @param object * @return * @throws IllegalAccessException */ public static Map<String, Object> getNotNullAndIdPropertyNameAndValueMap(Object object) throws IllegalAccessException { Map<String, Object> paramValueMap = new HashMap<String, Object>(); if (object != null) { Field[] fields = object.getClass().getDeclaredFields(); for (Field field : fields) { if (field.isAnnotationPresent(Column.class)) { field.setAccessible(true); String fieldName = field.getName(); if ("id".equals(fieldName)) { continue; } Object fieldValue = field.get(object); if (fieldValue != null) { paramValueMap.put(fieldName, fieldValue); } } } } return paramValueMap; } /** * 获取实体字段与值映射 * * @param object * @return * @throws IllegalAccessException */ public static Map<String, Object> getPropertyNameAndValueMap(Object object) throws IllegalAccessException { Map<String, Object> paramValueMap = new HashMap<String, Object>(); if (object != null) { Field[] fields = object.getClass().getDeclaredFields(); for (Field field : fields) { if (field.isAnnotationPresent(Column.class)) { field.setAccessible(true); String fieldName = field.getName(); Object fieldValue = field.get(object); paramValueMap.put(fieldName, fieldValue); } } } return paramValueMap; } }
分为“对应的方法”和使用示例两个方面进行介绍
/** * 根据id列表列出实体 * * @param <T> 实体所属的类型 * @param clazz 实体所属的类 * @param ids id列表 * @return 符合条件的实体列表 */ public static <T extends Entity> List<T> list(Class<T> clazz, Collection<?> ids) { List<T> entityList = new ArrayList<T>(); if (clazz != null && CollectionUtils.isNotEmpty(ids)) { StringBuffer JPQL = JPQLUtil.selectByPropertyIn(clazz, "id", ids); entityList = getRepository().createJpqlQuery(JPQL.toString()) .list(); } return entityList; } /** * 根据查询条件列出实体 * * @param <T> 实体所属的类型 * @param clazz 实体所属的类 * @param wherePropertyName 条件属性名 * @param wherePropertyValues 条件属性值列表 * @return 符合条件的实体列表 */ public static <T extends Entity> List<T> list(Class<T> clazz, String wherePropertyName, Collection<?> wherePropertyValues) { List<T> entityList = new ArrayList<T>(); if (clazz != null && CollectionUtils.isNotEmpty(wherePropertyValues)) { StringBuffer JPQL = JPQLUtil.selectByPropertyIn(clazz, wherePropertyName, wherePropertyValues); entityList = getRepository().createJpqlQuery(JPQL.toString()) .list(); } return entityList; } /** * 根据查询条件列出实体 * * @param <T> 实体所属的类型 * @param clazz 实体所属的类 * @param wherePropertyName2 条件属性名 * @param wherePropertyValues2 条件属性值列表 * @return 符合条件的实体列表 */ public static <T extends Entity> List<T> list(Class<T> clazz, String wherePropertyName1, Object wherePropertyValue1, String wherePropertyName2, Collection<?> wherePropertyValues2) { List<T> entityList = new ArrayList<T>(); String entityName = clazz.getSimpleName(); StringBuffer JPQL = JPQLUtil.selectEntity(entityName); JPQL.append(JPQLUtil.fromEntity(entityName)); JPQL.append(JPQLUtil.whereIdentity()); List<Object> conditionValues = new ArrayList<Object>(); if (StringUtils.isNotBlank(wherePropertyName1) && wherePropertyValue1 != null) { JPQL.append(JPQLUtil.andPropertyEqualQuestionSign(entityName, wherePropertyName1)); conditionValues.add(wherePropertyValue1); } if (StringUtils.isNotBlank(wherePropertyName2) && CollectionUtils.isNotEmpty(wherePropertyValues2)) { JPQL.append(JPQLUtil.andPropertyIn(entityName, wherePropertyName2, wherePropertyValues2)); } entityList = getRepository().createJpqlQuery(JPQL.toString()) .setParameters(conditionValues).list(); return entityList; } /** * 根据查询条件列出自关联的实体,JQPL语句形如: Select entityB From entity As entityA,entity As * entityB Where * entityA.entityNameARePropertyName=entityB.entityNameBRePropertyName And * entityA.entityAWherePropertyName1=entityAWherePropertyValue1 And * entityA.entityAWherePropertyName2 In (entityAWherePropertyValues2) * * @param <T> 实体所属的类型 * @param clazz 实体所属的类 * @param entityNameARePropertyName 进行自关联的属性名 * @param entityNameBRePropertyName 进行自关联的属性名 * @param entityAWherePropertyName1 entityB条件属性名 * @param entityAWherePropertyValue1 entityB条件属性值列表 * @param entityAWherePropertyName2 entityB条件属性名 * @param entityAWherePropertyValues2 entityB条件属性值列表 * @return 符合条件的实体列表 */ public static <T extends Entity> List<T> listSelfRelation(Class<T> clazz, String entityNameARePropertyName, String entityNameBRePropertyName, String entityAWherePropertyName1, Object entityAWherePropertyValue1, String entityAWherePropertyName2, Collection<?> entityAWherePropertyValues2) { List<T> entityList = new ArrayList<T>(); String entityNameA = EntityUtil.getEntityNameAppendA(clazz); String entityNameB = EntityUtil.getEntityNameAppendB(clazz); StringBuffer JPQL = JPQLUtil.selectEntity(entityNameB); JPQL.append(JPQLUtil.fromTowEntities(clazz)); JPQL.append(JPQLUtil.whereIdentity()); if (StringUtils.isNotBlank(entityNameARePropertyName) && StringUtils.isNotBlank(entityNameBRePropertyName)) { JPQL.append(JPQLUtil.andTwoEntityRelation(entityNameA, entityNameARePropertyName, entityNameB, entityNameBRePropertyName)); } List<Object> conditionValues = new ArrayList<Object>(); if (StringUtils.isNotBlank(entityAWherePropertyName1) && entityAWherePropertyValue1 != null) { JPQL.append(JPQLUtil.andPropertyEqualQuestionSign(entityNameA, entityAWherePropertyName1)); conditionValues.add(entityAWherePropertyValue1); } if (StringUtils.isNotBlank(entityAWherePropertyName2) && CollectionUtils.isNotEmpty(entityAWherePropertyValues2)) { JPQL.append(JPQLUtil.andPropertyIn(entityNameA, entityAWherePropertyName2, entityAWherePropertyValues2)); } entityList = getRepository().createJpqlQuery(JPQL.toString()) .setParameters(conditionValues).list(); return entityList; } /** * 根据查询条件列出自关联的实体,JQPL语句形如: Select entityB From entity As entityA,entity As * entityB Where * entityA.entityNameARePropertyName=entityB.entityNameBRePropertyName And * entityA.entityAWherePropertyName1=entityAWherePropertyValue1 * * @param <T> 实体所属的类型 * @param clazz 实体所属的类 * @param entityAWherePropertyName entityB条件属性名 * @param entityAWherePropertyValue entityB条件属性值列 * @return 符合条件的实体列表 */ public static <T extends Entity> List<T> listSelfRelation(Class<T> clazz, String entityNameARePropertyName, String entityNameBRePropertyName, String entityAWherePropertyName, Object entityAWherePropertyValue) { return listSelfRelation(clazz, entityNameARePropertyName, entityNameBRePropertyName, entityAWherePropertyName, entityAWherePropertyValue, null, null); }
public static List<PhotoType> listSonPhotoTypes(String fatherPhotoTypeName) { List<PhotoType> photoTypes = new ArrayList<PhotoType>(); if (StringUtils.isNotBlank(fatherPhotoTypeName)) { photoTypes = listSelfRelation(PhotoType.class, "id", "upid", "name", fatherPhotoTypeName); } return photoTypes; }
/** * 分页查询实体 * * @param <T> 实体所属的类型 * @param clazz 实体所属的类 * @param wherePropertyName 条件属性名 * @param wherePropertyValue 条件属性值 * @param pageIndex 当前页 * @param pageSize 每页显示的数据量 * @param orderByPropertyName 进行排序的属性名,为null则不排序 * @param isDESC 是否按倒序排列,为null或false按升序排序 * @return 符合条件的实体列表 */ public static <T extends Entity> Page<T> page(Class<T> clazz, int pageIndex, int pageSize, String wherePropertyName, Object wherePropertyValue, String orderByPropertyName, Boolean isDESC) { return page(clazz, wherePropertyName, wherePropertyValue, null, null, pageIndex, pageSize, orderByPropertyName, isDESC); } /** * 分页查询实体 * * @param <T> 实体所属的类型 * @param clazz 实体所属的类 * @param wherePropertyName 条件属性名 * @param wherePropertyValues 条件属性值列表 * @param pageIndex 当前页 * @param pageSize 每页显示的数据量 * @param orderByPropertyName 进行排序的属性名,为null则不排序 * @param isDESC 是否按倒序排列,为null或false按升序排序 * @return 符合条件的实体列表 */ public static <T extends Entity> Page<T> page(Class<T> clazz, String wherePropertyName, Collection<?> wherePropertyValues, int pageIndex, int pageSize, String orderByPropertyName, Boolean isDESC) { Page<T> entityPage = new Page<T>(0, 0, pageSize, new ArrayList<T>()); String entityName = EntityUtil.getEntityName(clazz); StringBuffer JPQL = JPQLUtil.selectByPropertyIn(entityName, wherePropertyName, wherePropertyValues); if (StringUtils.isNotBlank(JPQL) && CollectionUtils.isNotEmpty(wherePropertyValues)) { if (StringUtils.isNotBlank(orderByPropertyName)) { JPQL.append(JPQLUtil.orderBy(entityName, orderByPropertyName)); if (isDESC != null && isDESC) { JPQL.append(JPQLUtil.orderDESC()); } } entityPage = getQueryChannelService() .createJpqlQuery(JPQL.toString()) .setPage(pageIndex, pageSize).pagedList(); } return entityPage; } /** * 分页查询实体 * * @param <T> 实体所属的类型 * @param clazz 实体所属的类 * @param wherePropertyName1 条件1属性名 * @param wherePropertyValue1 条件1属性值列表 * @param wherePropertyName2 条件2属性名 * @param wherePropertyValues2 条件2属性值列表 * @param pageIndex 当前页 * @param pageSize 每页显示的数据量 * @param orderByPropertyName 进行排序的属性名,为null则不排序 * @param isDESC 是否按倒序排列,为null或false按升序排序 * @return 符合条件的实体列表 */ public static <T extends Entity> Page<T> page(Class<T> clazz, String wherePropertyName1, Object wherePropertyValue1, String wherePropertyName2, Collection<?> wherePropertyValues2, int pageIndex, int pageSize, String orderByPropertyName, Boolean isDESC) { Page<T> entityPage = new Page<T>(0, 0, pageSize, new ArrayList<T>()); String entityName = EntityUtil.getEntityName(clazz); StringBuffer JPQL = JPQLUtil.selectEntity(entityName); JPQL.append(JPQLUtil.fromEntity(entityName)); JPQL.append(JPQLUtil.whereIdentity()); List<Object> conditionValues = new ArrayList<Object>(); if (StringUtils.isNotBlank(wherePropertyName1) && wherePropertyValue1 != null) { JPQL.append(JPQLUtil.andPropertyEqualQuestionSign(entityName, wherePropertyName1)); conditionValues.add(wherePropertyValue1); } if (StringUtils.isNotBlank(wherePropertyName2) && CollectionUtils.isNotEmpty(wherePropertyValues2)) { JPQL.append(JPQLUtil.andPropertyIn(entityName, wherePropertyName2, wherePropertyValues2)); } if (StringUtils.isNotBlank(orderByPropertyName)) { JPQL.append(JPQLUtil.orderBy(entityName, orderByPropertyName)); if (isDESC != null && isDESC) { JPQL.append(JPQLUtil.orderDESC()); } } entityPage = getQueryChannelService().createJpqlQuery(JPQL.toString()) .setParameters(conditionValues).setPage(pageIndex, pageSize) .pagedList(); return entityPage; }
@Override @Transactional(propagation = Propagation.SUPPORTS, readOnly = true) public Page<PhotoCollectionDTO> page(int pageIndex, int pageSize, String type, String orderByPropertyName, Boolean isDESC) throws Exception { Page<PhotoCollectionDTO> photoCollectionDTOPage = new Page<PhotoCollectionDTO>( 0, 0, pageSize, new ArrayList<PhotoCollectionDTO>()); Page<PhotoCollection> photoCollectionPage = PhotoCollection.page( PhotoCollection.class, pageIndex, pageSize, "type", type, orderByPropertyName, isDESC); List<PhotoCollection> photoCollections = photoCollectionPage.getData(); if (photoCollectionPage != null && photoCollections.size() > 0) { List<String> photographerNameList = PhotoCollection .getCreatorList(photoCollections); Map<String, UserDetail> userNameAndUserDetailMap = UserDetail .getUserNameAndSelfMap(photographerNameList); List<PhotoCollectionDTO> photoCollectionDTOs = new ArrayList<PhotoCollectionDTO>(); for (PhotoCollection photoCollection : photoCollections) { PhotoCollectionDTO photoCollectionDTO = new PhotoCollectionDTO(); BeanUtils.copyProperties(photoCollectionDTO, photoCollection); UserDetail userDetail = userNameAndUserDetailMap .get(photoCollection.getCreator()); if (userDetail != null) { photoCollectionDTO.setPhotographerNickName(userDetail .getNickName()); photoCollectionDTO.setPhotographerAvatarPath(userDetail .getPhotoPath()); } photoCollectionDTOs.add(photoCollectionDTO); } photoCollectionDTOPage = new Page<PhotoCollectionDTO>( photoCollectionPage.getStart(), photoCollectionPage.getResultCount(), pageSize, photoCollectionDTOs); } return photoCollectionDTOPage; }