自己做的网站容易被黑吗我的个人主页模板
2026/1/11 6:32:41 网站建设 项目流程
自己做的网站容易被黑吗,我的个人主页模板,网站建设黄页软件,专业模板网站设计公司在 Spring Data JPA / Hibernate 项目中#xff0c;我们经常需要实现不同复杂度的查询。本文从简单到复杂#xff0c;梳理常用查询方案的特点、优缺点和适用场景#xff0c;包括#xff1a;Query、Specification / CriteriaBuilder、Hibernate Criteria、QueryDSL、Query b…在 Spring Data JPA / Hibernate 项目中我们经常需要实现不同复杂度的查询。本文从简单到复杂梳理常用查询方案的特点、优缺点和适用场景包括Query、Specification/CriteriaBuilder、Hibernate Criteria、QueryDSL、Query by ExampleQBE以及EntityManager.createNativeQuery。1️⃣原生 SQL / JPQL (Query)特点固定 SQL 或 JPQL参数绑定可选:param。优点直观SQL 性能可控。对聚合、多表查询支持良好。缺点动态条件写起来麻烦需要大量 if / OR 条件或手写 SQL 拼接。适合场景查询逻辑固定、复杂度不高例如简单报表或固定列表查询。示例Query(SELECT u FROM User u WHERE u.status :status AND u.department :dept)ListUserfindByStatusAndDepartment(Param(status)UserStatusstatus,Param(dept)Stringdepartment);2️⃣JpaSpecificationExecutor Specification / CriteriaBuilder特点Specification 是基于CriteriaBuilder CriteriaQuery Predicate的封装。提供标准 JPA 的动态查询能力。优点动态条件拼接灵活。类型安全编译期检查字段。支持分页、排序、简单聚合。缺点聚合、CASE WHEN 或复杂多表查询写起来冗长。语法比 QueryDSL 繁琐可读性略低。适合场景动态条件 单表或简单 JOIN 分页查询。需要标准 JPA API无需额外依赖的项目。示例CriteriaBuilder 原生使用CriteriaBuildercbentityManager.getCriteriaBuilder();CriteriaQueryUsercqcb.createQuery(User.class);RootUserrootcq.from(User.class);ListPredicatepredicatesnewArrayList();if(status!null)predicates.add(cb.equal(root.get(status),status));if(dept!null)predicates.add(cb.equal(root.get(department),dept));cq.select(root).where(cb.and(predicates.toArray(newPredicate[0])));ListUserusersentityManager.createQuery(cq).getResultList();示例Specification 封装SpecificationUserspec(root,query,cb)-{ListPredicatepredicatesnewArrayList();if(status!null)predicates.add(cb.equal(root.get(status),status));if(dept!null)predicates.add(cb.equal(root.get(department),dept));returncb.and(predicates.toArray(newPredicate[0]));};ListUserusersuserRepository.findAll(spec,Sort.by(username));3️⃣Hibernate Criteria / DetachedCriteria特点Hibernate 原生 Criteria API老版本 JPA 也有类似接口。优点与 Specification 类似可动态构建查询。缺点Hibernate 6 已不推荐使用新项目建议用 CriteriaBuilder 或 QueryDSL。适合场景历史项目或 Hibernate 原生项目。示例SessionsessionentityManager.unwrap(Session.class);Criteriacriteriasession.createCriteria(ExamInfo.class);if(status!null)criteria.add(Restrictions.eq(status,status));ListExamInfolistcriteria.list();4️⃣QueryDSL推荐复杂动态查询特点静态类型查询 DSL完全类型安全。支持动态条件、聚合、JOIN、排序。优点SQL 风格直观类型安全编译期检查。BooleanBuilder 拼接动态条件简单。支持复杂聚合、CASE WHEN、多表 JOIN、分页排序。缺点需要生成 Q 类QueryDSL 注解处理器生成学习成本稍高。示例复杂 SQL 转 QueryDSLQExamInfoeiQExamInfo.examInfo;QExamPaperetpQExamPaper.examPaper;QExamParticipantepQExamParticipant.examParticipant;JPAQueryExamInfoPageVoquerynewJPAQuery(entityManager);BooleanBuilderbuildernewBooleanBuilder();if(param.getStatus()!null)builder.and(ei.status.eq(param.getStatus()));if(StrUtil.isNotBlank(param.getExamName()))builder.and(ei.examName.like(%param.getExamName()%));query.select(Projections.constructor(ExamInfoPageVo.class,ei.id,ei.examName,ei.status,ei.validStartTime,ei.validEndTime,ei.reviewDelayDays,ei.paper.id,etp.title,etp.duration,etp.score,ep.count(),ep.when(ep.required.eq(true),1).sum(),ep.when(ep.required.eq(false).and(ep.finalScore.isNull()),1).sum())).from(ei).leftJoin(ei.paper,etp).leftJoin(ei.participants,ep).where(builder).groupBy(ei.id,ei.examName,ei.status,ei.validStartTime,ei.validEndTime,ei.reviewDelayDays,ei.paper.id,etp.title,etp.duration,etp.score).fetch();其中 JPAQuery 可换成全局的 queryFactoryConfiguration public class QueryDslConfig { PersistenceContext private EntityManager entityManager; Bean public JPAQueryFactory jpaQueryFactory() { return new JPAQueryFactory(entityManager); } } 然后 Resource private JPAQueryFactory queryFactory; queryFactory.select().fetch(); queryFactory.update().execute()5️⃣Spring Data JPA Query by Example (QBE)特点根据实体示例生成查询。优点快速生成简单查询无需写 SQL / Specification。类型安全代码简洁。缺点几乎不支持 JOIN、聚合和复杂 CASE WHEN。动态条件能力有限只能匹配实体非空属性。适合场景简单动态条件查询、快速原型或后台管理系统。示例UserprobenewUser();probe.setStatus(UserStatus.ACTIVE);probe.setDepartment(IT);ExampleMatchermatcherExampleMatcher.matching().withIgnorePaths(id).withIgnoreCase(username).withStringMatcher(StringMatcher.CONTAINING);ExampleUserexampleExample.of(probe,matcher);ListUserusersuserRepository.findAll(example);6️⃣EntityManager.createNativeQuery原生 SQL特点直接执行原生 SQL 查询或更新。优点支持所有 SQL 特性JOIN、聚合、CASE、函数。可调用数据库特定函数或存储过程。性能可控适合复杂查询或批量操作。缺点不类型安全运行时才报错。需要手动映射结果到 DTO/VO。适合场景报表查询、复杂聚合、多表操作。数据库特性函数调用JSON、存储过程等。批量更新/删除操作。极端性能优化场景。示例QueryqueryentityManager.createNativeQuery(SELECT d.dept_name, COUNT(u.id) AS user_count FROM users u JOIN department d ON u.dept_id d.id GROUP BY d.dept_name);ListObject[]resultsquery.getResultList();for(Object[]row:results){System.out.println(Dept: row[0], Count: row[1]);}7️⃣查询方式对比表查询方式动态条件聚合/CASE WHENJOIN类型安全可读性适用场景Query (JPQL/SQL)❌固定✅ 支持✅ 支持❌高简单或固定查询、报表Specification / CriteriaBuilder✅ 完全动态部分✅ 支持简单 JOIN✅中动态条件、分页、简单聚合Hibernate Criteria✅部分✅ 支持✅中历史项目或 Hibernate 原生项目QueryDSL✅ 完全动态✅ 支持✅ 支持✅高复杂动态查询、多表聚合、报表QBE✅ 受限❌ 不支持❌ 不支持✅高简单实体查询、快速原型createNativeQuery❌固定可手动拼接✅ 支持✅ 支持❌中报表、复杂聚合、多表操作、数据库函数、批量操作8️⃣总结建议固定查询、简单报表Query最直接。动态条件 分页 简单聚合Specification / CriteriaBuilder标准 JPA API复杂动态查询、多表 JOIN、聚合、报表类查询QueryDSL 最适合。快速简单动态查询单表QBE 方便但企业项目使用不多。依赖数据库特性、复杂 SQL、性能优化、批量操作原生 SQL (createNativeQuery) 最灵活。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询