Querydsl中文文档翻译.pdf
《Querydsl中文文档翻译.pdf》由会员分享,可在线阅读,更多相关《Querydsl中文文档翻译.pdf(41页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、0122.12.2目錄引言介绍教程QueryingJPAQueryingSQLQuerydsl中文文档翻译2引言Querydsl是一个能使用静态类型构建类似于SQL的查询的框架。Querydsl通过流畅的API调用来构建原本需要用字符串连接或外部XML文件配置的查询。相比于简单的字符串,使用级联API方法调用的好处在于IDE的代码提示几乎没有语法来允许无效的查询领域类和属性可以线程安全的引用变更领域类时可以更好的重构Querydsl中文文档翻译3引言1.介绍1.1.背景Querydsl能够诞生,是因为需要在类型安全的方式下进行HQL查询。构造的HQL查询需要拼接字符串,并且会导致代码难以阅读。
2、通过纯字符串对领域类型和属性的不安全引用是基于字符串构建HQL的另一个问题。随着类型安全的领域模型的不断的发展,给软件开发带了巨大的好处。领域最大的改变直接反应在查询和自动查询的构建,它使查询构建更快且安全。Querydsl最先支持的是Hibernate的HQL语言,现如今,Querydsl已经支持JPA,JDO,JDBC,Lucene,HibernateSearch,MangoDB,Collections和RDF(RelationalDataFormat)Bean作为后端。1.2.原则类型安全是Querydsl的核心原则。查询是基于与领域类型的属性映射生成的查询类型构建的。同时,函数/方法的
3、调用也是使用完全的类型安全的方式构建的。保持一致是另一个重要的原则。查询路径(Path)和操作在所有实现中都是相同的,它们都具有一个公用的基本接口。要想获得更多Querydsl查询和表达式的说明,请查看javadoc中的 com.querydsl.core.Query, com.querydsl.core.Fetchable和 com.querydsl.core.types.Expression类的文档。Querydsl中文文档翻译4介绍教程与一般的入门指南不同,我们提供了以Querydsl为主后端的综合教程。QueryingJPAQueryingSQLQuerydsl中文文档翻译5教程2.1
4、.QueryingJPAQuerydsl定义了一个通用静态类型的语法用于查询持久化的领域模型数据。JDO和JPA是Querydsl主要的集成技术。这篇手册介绍了如何让Querydsl与JPA整合使用。QuerydslJPA是JPQL和标准条件查询(Criteriaqueries)的新的使用方式。它结合了条件查询的动态性和JPQL的表达能力,并且使用了完全的类型安全方式。2.1.1.Maven集成在你的maven项目中添加下面的依赖:com.querydslquerydsl-apt$querydsl.versionprovidedcom.querydslquerydsl-jpa$querydsl
5、.versionorg.slf4jslf4j-log4j121.6.1现在,来配置mavenAPT插件:Querydsl中文文档翻译6QueryingJPA.com.mysema.mavenapt-maven-plugin1.1.3processtarget/generated-sources/javacom.querydsl.apt.jpa.JPAAnnotationProcessor. JPAAnnotationProcessor查找带有 javax.persistence.Entity注解的领域类型并为其生成查询类型。如果你在领域类型中使用的是Hibernate的注解,那应该使用APT处
6、理器 com.querydsl.apt.hibernate.HibernateAnnotationProcessor来代替 JPAAnnotationProcessor。运行 cleaninstall命令后,在 target/generated-sources/java目录下将生成相应的查询类型。如果你使用Eclipse,运行 mvneclipse:eclipse更新你的Eclipse项目,将 target/generated-sources/java作为源目录。现在,你就可以构建JPA查询实例和查询领域模型的实例了。Querydsl中文文档翻译7QueryingJPA2.1.2.Ant集成将
7、Querydsl的所有依赖包(jar)放到你的classpath目录下,使用并执行下面的Querydsl代码生成的任务:将 src替换为你的主要的源代码目录, generated替换为你需要生成的源代码的目标目录。2.1.3.在Roo中使用QuerydslJPA如果你正在使用QuerydslJPA和SpringRoo,你可以使用 com.querydsl.apt.roo.RooAnnotationProcessor替换 com.querydsl.apt.jpa.JPAAnnotationProcessor,它将解析并处理 RooJpaEntity和 RooJpaActiveRecord注解,而
8、不是Entity。基于APT的代码生成器不支持与AspectJIDTs整合。2.1.4.从hbm.xml文件中生成模型如果你使用的Hibernate是基于XML配置的,那么你可以使用XML元数据来生成Querydsl模型。 com.querydsl.jpa.codegen.HibernateDomainExporter提供了这样的功能:Querydsl中文文档翻译8QueryingJPAHibernateDomainExporterexporter=newHibernateDomainExporter(Q,/名称前缀newFile(target/gen3),/生成的目标文件夹configura
9、tion);/org.hibernate.cfg.Configuration实例exporter.export(); HibernateDomainExporter需要在领域类型可见的 classpath中执行,因为属性类型是通过反射机制获得的。所有的JPA注解都会被忽略,但是Querydsl的注解不会被忽略,比如 QueryInit和 QueryType。2.1.5.使用查询类型TocreatequerieswithQuerydslyouneedtoinstantiatevariablesandQueryimplementations.Wewillstartwiththevariables.
10、Letsassumethatyourprojecthasthefollowingdomaintype:Querydsl中文文档翻译9QueryingJPAEntitypublicclassCustomerprivateStringfirstName;privateStringlastName;publicStringgetFirstName()returnfirstName;publicStringgetLastName()returnlastName;publicvoidsetFirstName(Stringfn)firstName=fn;publicvoidsetLastName(Stri
11、ngln)lastName=ln;Querydsl会在 Customer类的同一个包内生成一个名称为 QCustomer的查询类。 QCustomer的静态实例变量可在Querydsl查询中作为 Customer类的代表。 QCustomer有一个默认的静态实例变量:QCustomercustomer=QCustomer.customer;或者你可以像下面列子一样定义查询类实例变量:QCustomercustomer=newQCustomer(myCustomer);2.1.6.查询QuerydslJPA模块同时支持JPA和HibernateAPI。Querydsl中文文档翻译10Queryi
12、ngJPA当使用JPA时,需要用到 JPAQuery实例,就像下面的例子:/whereentityManagerisaJPAEntityManagerJPAQueryquery=newJPAQuery(entityManager);如是你使用的是HibernateAPI,你可以实例化一个 HibernateQuery:/wheresessionisaHibernatesessionHibernateQueryquery=newHibernateQuery(session); JPAQuery和 HibernateQuery都实现了JPQLQuery这个接口。本章中的例子中的查询是通过 JPAQ
13、ueryFactory实例创建的。最佳实践是通过 JPAQueryFactory来获取 JPAQuery实例。如需HibernateAPI,可以使用 HibernateQueryFactory。构造一个获取名字为Bob的一个customer的信息的查询:/queryFactory=JPAQueryFactoryQCustomercustomer=QCustomer.customer;Customerbob=queryFactory.selectFrom(customer).where(customer.firstName.eq(Bob).fetchOne();调用 selectFrom方法是定
14、义查询的来源与映射, where则定义查询的过滤器, fetchOne则要告诉Querydsl返回单个元素( SQLQuery中的泛型指定元素类型)。很简单,不是吗!创建多资源(表)查询:QCustomercustomer=QCustomer.customer;QCompanycompany=QCpany;query.from(customer,company);使用多个查询条件过滤器:Querydsl中文文档翻译11QueryingJPAqueryFactory.selectFrom(customer).where(customer.firstName.eq(Bob),customer.la
15、stName.eq(Wilson);或者:queryFactory.selectFrom(customer).where(customer.firstName.eq(Bob).and(customer.lastName.eq(Wilson);使用原生的JPQL查询语句:selectcustomerfromCustomerascustomerwherecustomer.firstName=Bobandcustomer.lastName=Wilson如果你想使用 or来组合条件过滤器,可以使用下面的方式:queryFactory.selectFrom(customer).where(custome
16、r.firstName.eq(Bob).or(customer.lastName.eq(Wilson);2.1.7.联合查询Querydsl在JPQL中支持的联合查询: innerjoin,join,leftjoin,rightjoin。联合查询是类型安全的,并且遵循下面的模式:QCatcat=QCat.cat;QCatmate=newQCat(mate);QCatkitten=newQCat(kitten);queryFactory.selectFrom(cat).innerJoin(cat.mate,mate).leftJoin(cat.kittens,kitten).fetch();下面
17、是原生的JPQL查询的语句:Querydsl中文文档翻译12QueryingJPAselectcatfromCatascatinnerjoincat.mateasmateleftouterjoincat.kittensaskitten再来一个例子:queryFactory.selectFrom(cat).leftJoin(cat.kittens,kitten).on(kitten.bodyWeight.gt(10.0).fetch();上述最终生成的原生的JPQL的语句:selectcatfromCatascatleftjoincat.kittensaskittenonkitten.bodyW
18、eight10.02.1.8.一般用法 JPQLQuery接口可以进行级联调用的方法说明: select:设置查询的映射(如果由查询工厂创建查询,则不需要调用) from:添加查询的源(表) innerJoin,join,leftJoin,rightJoin,on:使用这些方法添加要 join的元素。连接方法的第一个参数是要连接的源,第二个参数是源目标(别名)。 where:添加查询过滤器,以逗号分隔的可变参数传入,或是使用 and或or操作连接。 groupBy:以可变参数形式添加查询的分组。 having:添加具有 GROUPBY分组作为断言(Predicate)表达式的可变参数数组的 H
19、AVING过滤器 orderBy:添加结果的排序方式的排序表达式。使用 asc()和desc()方法获取基于数字、字符串或其他可进行比较的表达式的 OrderSpecifier实例 limit,offset,restrict:设置分页查询的结果。 limit为结果的最大行数, offset是偏移的行数, restrict则是两者的限定约束Querydsl中文文档翻译13QueryingJPA2.1.9.结果排序(Ordering)声明结果排序:QCustomercustomer=QCustomer.customer;queryFactory.selectFrom(customer).order
20、By(customer.lastName.asc(),customer.firstName.desc().fetch();等效于下面的原生JPQL语句:selectcustomerfromCustomerascustomerorderbycustomer.lastNameasc,customer.firstNamedesc2.1.10.分组(Grouping)下面的是对结果分组:queryFactory.select(customer.lastName).from(customer).groupBy(customer.lastName).fetch();等效于下面的原生JPQL语句:selec
21、tcustomer.lastNamefromCustomerascustomergroupbycustomer.lastName2.1.11.删除语句在QuerydslJPA中,删除语句是简单的 delete-where-execute形式。下面是一个例子:Querydsl中文文档翻译14QueryingJPAQCustomercustomer=QCustomer.customer;/deleteallcustomersqueryFactory.delete(customer).execute();/deleteallcustomerswithalevellessthan3queryFacto
22、ry.delete(customer).where(customer.level.lt(3).execute();调用 where方法是可选的,调用 execute方法是执行删除操作并返回被删除实体的数量。JPA中的DML语句并不考虑JPA级联规则,也不提供细粒度二级缓存的交互。2.1.12.更新语句在QuerydslJPA中,更新语句是简单的 update-set/where-execute形式。下面是一个例子:QCustomercustomer=QCustomer.customer;/renamecustomersnamedBobtoBobbyqueryFactory.update(cus
23、tomer).where(customer.name.eq(Bob).set(customer.name,Bobby).execute();调用 set方法以 SQL-Update-style方式定义要更新的属性,execute调用指行更新操作并返回被更新的实体的数量。JPA中的DML语句并不考虑JPA级联规则,也不提供细粒度二级缓存的交互。2.1.13.子查询使用 JPAExpressions的静态工厂方法创建一个子查询,并且通过调用 from, where等定义查询参数。Querydsl中文文档翻译15QueryingJPAQDepartmentdepartment=QDepartment
24、.department;QDepartmentd=newQDepartment(d);queryFactory.selectFrom(department).where(department.size.eq(JPAExpressions.select(d.size.max().from(d).fetch();再来一个例子:QEmployeeemployee=QEmployee.employee;QEmployeee=newQEmployee(e);queryFactory.selectFrom(employee).where(employee.weeklyhours.gt(JPAExpress
25、ions.select(e.weeklyhours.avg().from(employee.department.employees,e).where(e.manager.eq(employee.manager).fetch();2.1.14.使用原始查询如果你在查询执行前需要调整原有的查询,则可以像下面这样暴露她:QueryjpaQuery=queryFactory.selectFrom(employee).createQuery();/.Listresults=jpaQuery.getResultList();2.1.15.JPA查询中使用本地SQL查询Querydsl支持通过 JPASQ
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Querydsl 中文 文档 翻译
限制150内