JPA自定义查询

蔚落 2023-10-04 17:49 171阅读 0赞

在使用JPA过程中,写nativeQuery无法满足所有需求,只能寻求其他的途径,下面是一种方法

  1. /**
  2. * 增加过滤条件
  3. *
  4. * @return
  5. */
  6. private Specification<User> listUserSpec(BizUserQueryCriteria criteria) {
  7. return (Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) -> {
  8. List<Predicate> list = new ArrayList<>();
  9. //常规查询条件
  10. list = QueryHelp.getList(list, root, criteria, cb);
  11. // order by id desc
  12. query.orderBy(cb.desc(root.get("id")));
  13. //子查询开始
  14. Subquery<User> subquery = query.subquery(User.class);
  15. Root<User> root1 = subquery.from(User.class);
  16. //select id from
  17. subquery = subquery.select(root1.get("id"));
  18. List<Predicate> sub = new ArrayList();
  19. if (criteria.getGradeFlag()) {
  20. // 年级不在指定值范围内
  21. String[] grades = new String[]{
  22. "六年级","初三"};
  23. sub.add(cb.not(root1.get("grade").in(Arrays.asList(grades))));
  24. //or grade not in ('六年级','初三')
  25. }
  26. if (criteria.getSchoolTypeFlag()) {
  27. // 学校类型不在指定值范围内
  28. String[] schoolTypes = new String[]{
  29. "小学","初中"};
  30. sub.add(cb.not(root1.get("schoolType").in(Arrays.asList(schoolTypes))));
  31. //or school_type not in ('小学','初中')
  32. }
  33. if (criteria.getCardNumFlag()) {
  34. // 身份证号码不符合规范
  35. sub.add(cb.and(cb.equal(root1.get("cardType"), "身份证"), cb.and(cb.notEqual(cb.length(cb.trim(root1.get("cardNum"))), 18), cb.notEqual(cb.length(cb.trim(root1.get("cardNum"))), 15))));
  36. //or (card_type` = '身份证' and length(`card_num`) <> 18 and length(`card_num`) <> 15)
  37. }
  38. if (criteria.getGenderFlag()) {
  39. // 性别为空
  40. sub.add(cb.or(cb.isNull(root1.get("gender")), cb.equal(cb.trim(root1.get("gender")), "")));
  41. //or gender is null
  42. }
  43. if (criteria.getSchoolYearFlag()) {
  44. // 学年不符合规范
  45. sub.add(cb.notEqual(cb.length(cb.trim(root1.get("schoolYear"))),15));
  46. //or (length(`school_year`) <> 15)
  47. }
  48. if (criteria.getSchoolYearNullFlag()) {
  49. //学年为空
  50. sub.add(cb.isNull(root1.get("schoolYear")));
  51. //or school_year is null
  52. }
  53. if (criteria.getHouseholdTypeFlag()) {
  54. // 户籍类型为空
  55. sub.add(cb.isNull(root1.get("householdType")));
  56. //or household_type is null
  57. }
  58. if (criteria.getRegionFlag()) {
  59. //区域或城市为空
  60. sub.add(cb.and(cb.isNull(root1.get("region")), cb.isNull(root1.get("outsideCity"))));
  61. //or (region is null and outside_city is null)
  62. }
  63. if (criteria.getCurrentAddressFlag()) {
  64. // 住址为空
  65. sub.add(cb.isNull(root1.get("currentAddress")));
  66. //or current_address is null
  67. }
  68. if (criteria.getAvatarPathFlag()) {
  69. // 头像为空
  70. sub.add(cb.isNull(root1.get("avatarPath")));
  71. //or avatar_path is null
  72. }
  73. int subSize = sub.size();
  74. if (subSize > 0) {
  75. Predicate predicate = cb.or(sub.toArray(new Predicate[subSize]));
  76. subquery = subquery.where(predicate);
  77. list.add(cb.and(root.get("id").in(subquery)));
  78. }
  79. int size = list.size();
  80. return cb.and(list.toArray(new Predicate[size]));
  81. };
  82. }
  83. // 调用
  84. public List<User> queryAll(BizUserQueryCriteria criteria) {
  85. List<User> users = userRepository.findAll(listUserSpec(criteria));
  86. }

可以研究一下 CriteriaBuilder ,有很多可能用得到的方法

  1. package javax.persistence.criteria;
  2. import java.math.BigDecimal;
  3. import java.math.BigInteger;
  4. import java.sql.Date;
  5. import java.sql.Time;
  6. import java.sql.Timestamp;
  7. import java.util.Collection;
  8. import java.util.Map;
  9. import java.util.Set;
  10. import javax.persistence.Tuple;
  11. public interface CriteriaBuilder {
  12. CriteriaQuery<Object> createQuery();
  13. <T> CriteriaQuery<T> createQuery(Class<T> var1);
  14. CriteriaQuery<Tuple> createTupleQuery();
  15. <T> CriteriaUpdate<T> createCriteriaUpdate(Class<T> var1);
  16. <T> CriteriaDelete<T> createCriteriaDelete(Class<T> var1);
  17. <Y> CompoundSelection<Y> construct(Class<Y> var1, Selection<?>... var2);
  18. CompoundSelection<Tuple> tuple(Selection<?>... var1);
  19. CompoundSelection<Object[]> array(Selection<?>... var1);
  20. Order asc(Expression<?> var1);
  21. Order desc(Expression<?> var1);
  22. <N extends Number> Expression<Double> avg(Expression<N> var1);
  23. <N extends Number> Expression<N> sum(Expression<N> var1);
  24. Expression<Long> sumAsLong(Expression<Integer> var1);
  25. Expression<Double> sumAsDouble(Expression<Float> var1);
  26. <N extends Number> Expression<N> max(Expression<N> var1);
  27. <N extends Number> Expression<N> min(Expression<N> var1);
  28. <X extends Comparable<? super X>> Expression<X> greatest(Expression<X> var1);
  29. <X extends Comparable<? super X>> Expression<X> least(Expression<X> var1);
  30. Expression<Long> count(Expression<?> var1);
  31. Expression<Long> countDistinct(Expression<?> var1);
  32. Predicate exists(Subquery<?> var1);
  33. <Y> Expression<Y> all(Subquery<Y> var1);
  34. <Y> Expression<Y> some(Subquery<Y> var1);
  35. <Y> Expression<Y> any(Subquery<Y> var1);
  36. Predicate and(Expression<Boolean> var1, Expression<Boolean> var2);
  37. Predicate and(Predicate... var1);
  38. Predicate or(Expression<Boolean> var1, Expression<Boolean> var2);
  39. Predicate or(Predicate... var1);
  40. Predicate not(Expression<Boolean> var1);
  41. Predicate conjunction();
  42. Predicate disjunction();
  43. Predicate isTrue(Expression<Boolean> var1);
  44. Predicate isFalse(Expression<Boolean> var1);
  45. Predicate isNull(Expression<?> var1);
  46. Predicate isNotNull(Expression<?> var1);
  47. Predicate equal(Expression<?> var1, Expression<?> var2);
  48. Predicate equal(Expression<?> var1, Object var2);
  49. Predicate notEqual(Expression<?> var1, Expression<?> var2);
  50. Predicate notEqual(Expression<?> var1, Object var2);
  51. <Y extends Comparable<? super Y>> Predicate greaterThan(Expression<? extends Y> var1, Expression<? extends Y> var2);
  52. <Y extends Comparable<? super Y>> Predicate greaterThan(Expression<? extends Y> var1, Y var2);
  53. <Y extends Comparable<? super Y>> Predicate greaterThanOrEqualTo(Expression<? extends Y> var1, Expression<? extends Y> var2);
  54. <Y extends Comparable<? super Y>> Predicate greaterThanOrEqualTo(Expression<? extends Y> var1, Y var2);
  55. <Y extends Comparable<? super Y>> Predicate lessThan(Expression<? extends Y> var1, Expression<? extends Y> var2);
  56. <Y extends Comparable<? super Y>> Predicate lessThan(Expression<? extends Y> var1, Y var2);
  57. <Y extends Comparable<? super Y>> Predicate lessThanOrEqualTo(Expression<? extends Y> var1, Expression<? extends Y> var2);
  58. <Y extends Comparable<? super Y>> Predicate lessThanOrEqualTo(Expression<? extends Y> var1, Y var2);
  59. <Y extends Comparable<? super Y>> Predicate between(Expression<? extends Y> var1, Expression<? extends Y> var2, Expression<? extends Y> var3);
  60. <Y extends Comparable<? super Y>> Predicate between(Expression<? extends Y> var1, Y var2, Y var3);
  61. Predicate gt(Expression<? extends Number> var1, Expression<? extends Number> var2);
  62. Predicate gt(Expression<? extends Number> var1, Number var2);
  63. Predicate ge(Expression<? extends Number> var1, Expression<? extends Number> var2);
  64. Predicate ge(Expression<? extends Number> var1, Number var2);
  65. Predicate lt(Expression<? extends Number> var1, Expression<? extends Number> var2);
  66. Predicate lt(Expression<? extends Number> var1, Number var2);
  67. Predicate le(Expression<? extends Number> var1, Expression<? extends Number> var2);
  68. Predicate le(Expression<? extends Number> var1, Number var2);
  69. <N extends Number> Expression<N> neg(Expression<N> var1);
  70. <N extends Number> Expression<N> abs(Expression<N> var1);
  71. <N extends Number> Expression<N> sum(Expression<? extends N> var1, Expression<? extends N> var2);
  72. <N extends Number> Expression<N> sum(Expression<? extends N> var1, N var2);
  73. <N extends Number> Expression<N> sum(N var1, Expression<? extends N> var2);
  74. <N extends Number> Expression<N> prod(Expression<? extends N> var1, Expression<? extends N> var2);
  75. <N extends Number> Expression<N> prod(Expression<? extends N> var1, N var2);
  76. <N extends Number> Expression<N> prod(N var1, Expression<? extends N> var2);
  77. <N extends Number> Expression<N> diff(Expression<? extends N> var1, Expression<? extends N> var2);
  78. <N extends Number> Expression<N> diff(Expression<? extends N> var1, N var2);
  79. <N extends Number> Expression<N> diff(N var1, Expression<? extends N> var2);
  80. Expression<Number> quot(Expression<? extends Number> var1, Expression<? extends Number> var2);
  81. Expression<Number> quot(Expression<? extends Number> var1, Number var2);
  82. Expression<Number> quot(Number var1, Expression<? extends Number> var2);
  83. Expression<Integer> mod(Expression<Integer> var1, Expression<Integer> var2);
  84. Expression<Integer> mod(Expression<Integer> var1, Integer var2);
  85. Expression<Integer> mod(Integer var1, Expression<Integer> var2);
  86. Expression<Double> sqrt(Expression<? extends Number> var1);
  87. Expression<Long> toLong(Expression<? extends Number> var1);
  88. Expression<Integer> toInteger(Expression<? extends Number> var1);
  89. Expression<Float> toFloat(Expression<? extends Number> var1);
  90. Expression<Double> toDouble(Expression<? extends Number> var1);
  91. Expression<BigDecimal> toBigDecimal(Expression<? extends Number> var1);
  92. Expression<BigInteger> toBigInteger(Expression<? extends Number> var1);
  93. Expression<String> toString(Expression<Character> var1);
  94. <T> Expression<T> literal(T var1);
  95. <T> Expression<T> nullLiteral(Class<T> var1);
  96. <T> ParameterExpression<T> parameter(Class<T> var1);
  97. <T> ParameterExpression<T> parameter(Class<T> var1, String var2);
  98. <C extends Collection<?>> Predicate isEmpty(Expression<C> var1);
  99. <C extends Collection<?>> Predicate isNotEmpty(Expression<C> var1);
  100. <C extends Collection<?>> Expression<Integer> size(Expression<C> var1);
  101. <C extends Collection<?>> Expression<Integer> size(C var1);
  102. <E, C extends Collection<E>> Predicate isMember(Expression<E> var1, Expression<C> var2);
  103. <E, C extends Collection<E>> Predicate isMember(E var1, Expression<C> var2);
  104. <E, C extends Collection<E>> Predicate isNotMember(Expression<E> var1, Expression<C> var2);
  105. <E, C extends Collection<E>> Predicate isNotMember(E var1, Expression<C> var2);
  106. <V, M extends Map<?, V>> Expression<Collection<V>> values(M var1);
  107. <K, M extends Map<K, ?>> Expression<Set<K>> keys(M var1);
  108. Predicate like(Expression<String> var1, Expression<String> var2);
  109. Predicate like(Expression<String> var1, String var2);
  110. Predicate like(Expression<String> var1, Expression<String> var2, Expression<Character> var3);
  111. Predicate like(Expression<String> var1, Expression<String> var2, char var3);
  112. Predicate like(Expression<String> var1, String var2, Expression<Character> var3);
  113. Predicate like(Expression<String> var1, String var2, char var3);
  114. Predicate notLike(Expression<String> var1, Expression<String> var2);
  115. Predicate notLike(Expression<String> var1, String var2);
  116. Predicate notLike(Expression<String> var1, Expression<String> var2, Expression<Character> var3);
  117. Predicate notLike(Expression<String> var1, Expression<String> var2, char var3);
  118. Predicate notLike(Expression<String> var1, String var2, Expression<Character> var3);
  119. Predicate notLike(Expression<String> var1, String var2, char var3);
  120. Expression<String> concat(Expression<String> var1, Expression<String> var2);
  121. Expression<String> concat(Expression<String> var1, String var2);
  122. Expression<String> concat(String var1, Expression<String> var2);
  123. Expression<String> substring(Expression<String> var1, Expression<Integer> var2);
  124. Expression<String> substring(Expression<String> var1, int var2);
  125. Expression<String> substring(Expression<String> var1, Expression<Integer> var2, Expression<Integer> var3);
  126. Expression<String> substring(Expression<String> var1, int var2, int var3);
  127. Expression<String> trim(Expression<String> var1);
  128. Expression<String> trim(CriteriaBuilder.Trimspec var1, Expression<String> var2);
  129. Expression<String> trim(Expression<Character> var1, Expression<String> var2);
  130. Expression<String> trim(CriteriaBuilder.Trimspec var1, Expression<Character> var2, Expression<String> var3);
  131. Expression<String> trim(char var1, Expression<String> var2);
  132. Expression<String> trim(CriteriaBuilder.Trimspec var1, char var2, Expression<String> var3);
  133. Expression<String> lower(Expression<String> var1);
  134. Expression<String> upper(Expression<String> var1);
  135. Expression<Integer> length(Expression<String> var1);
  136. Expression<Integer> locate(Expression<String> var1, Expression<String> var2);
  137. Expression<Integer> locate(Expression<String> var1, String var2);
  138. Expression<Integer> locate(Expression<String> var1, Expression<String> var2, Expression<Integer> var3);
  139. Expression<Integer> locate(Expression<String> var1, String var2, int var3);
  140. Expression<Date> currentDate();
  141. Expression<Timestamp> currentTimestamp();
  142. Expression<Time> currentTime();
  143. <T> CriteriaBuilder.In<T> in(Expression<? extends T> var1);
  144. <Y> Expression<Y> coalesce(Expression<? extends Y> var1, Expression<? extends Y> var2);
  145. <Y> Expression<Y> coalesce(Expression<? extends Y> var1, Y var2);
  146. <Y> Expression<Y> nullif(Expression<Y> var1, Expression<?> var2);
  147. <Y> Expression<Y> nullif(Expression<Y> var1, Y var2);
  148. <T> CriteriaBuilder.Coalesce<T> coalesce();
  149. <C, R> CriteriaBuilder.SimpleCase<C, R> selectCase(Expression<? extends C> var1);
  150. <R> CriteriaBuilder.Case<R> selectCase();
  151. <T> Expression<T> function(String var1, Class<T> var2, Expression<?>... var3);
  152. <X, T, V extends T> Join<X, V> treat(Join<X, T> var1, Class<V> var2);
  153. <X, T, E extends T> CollectionJoin<X, E> treat(CollectionJoin<X, T> var1, Class<E> var2);
  154. <X, T, E extends T> SetJoin<X, E> treat(SetJoin<X, T> var1, Class<E> var2);
  155. <X, T, E extends T> ListJoin<X, E> treat(ListJoin<X, T> var1, Class<E> var2);
  156. <X, K, T, V extends T> MapJoin<X, K, V> treat(MapJoin<X, K, T> var1, Class<V> var2);
  157. <X, T extends X> Path<T> treat(Path<X> var1, Class<T> var2);
  158. <X, T extends X> Root<T> treat(Root<X> var1, Class<T> var2);
  159. public interface Case<R> extends Expression<R> {
  160. CriteriaBuilder.Case<R> when(Expression<Boolean> var1, R var2);
  161. CriteriaBuilder.Case<R> when(Expression<Boolean> var1, Expression<? extends R> var2);
  162. Expression<R> otherwise(R var1);
  163. Expression<R> otherwise(Expression<? extends R> var1);
  164. }
  165. public interface SimpleCase<C, R> extends Expression<R> {
  166. Expression<C> getExpression();
  167. CriteriaBuilder.SimpleCase<C, R> when(C var1, R var2);
  168. CriteriaBuilder.SimpleCase<C, R> when(C var1, Expression<? extends R> var2);
  169. Expression<R> otherwise(R var1);
  170. Expression<R> otherwise(Expression<? extends R> var1);
  171. }
  172. public interface Coalesce<T> extends Expression<T> {
  173. CriteriaBuilder.Coalesce<T> value(T var1);
  174. CriteriaBuilder.Coalesce<T> value(Expression<? extends T> var1);
  175. }
  176. public interface In<T> extends Predicate {
  177. Expression<T> getExpression();
  178. CriteriaBuilder.In<T> value(T var1);
  179. CriteriaBuilder.In<T> value(Expression<? extends T> var1);
  180. }
  181. public static enum Trimspec {
  182. LEADING,
  183. TRAILING,
  184. BOTH;
  185. private Trimspec() {
  186. }
  187. }
  188. }

发表评论

表情:
评论列表 (有 0 条评论,171人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JPA定义查询

    在使用JPA过程中,写nativeQuery无法满足所有需求,只能寻求其他的途径,下面是一种方法 / 增加过滤条件 @return