能上国外网站的免费dns,wordpress 大发,云南网站设计定制,响水县住房和城乡建设局网站jooq映射原理JOOQ是一个简洁的框架#xff0c;它解决了我在使用高级动态过滤查询时遇到的一个长期问题。 尽管Hibernate和JPA附带了一个有用的Criteria API#xff08;我已经使用了很长一段时间#xff09;#xff0c;但是您可以使用这些API进行操作有一些可以理解的限制。… jooq映射原理 JOOQ是一个简洁的框架它解决了我在使用高级动态过滤查询时遇到的一个长期问题。 尽管Hibernate和JPA附带了一个有用的Criteria API我已经使用了很长一段时间但是您可以使用这些API进行操作有一些可以理解的限制。 例如您不能超出简单SQL操作例如JOINSNESTED SLECTSAGGREGATION并执行类似的操作 窗口函数 用户定义的函数或简单的排序等 。 JOOQ不想和Hibernate竞争但我觉得它可以完成它。 我一直在将Hibernate用于数据层的WRITE部分因此使用它的名称或JPA中的“ Persisting”部分。 对于简单到中等复杂的查询Hibernate会尽力而为但是我不必仅依靠它来进行所有查询是吗 查询属性还有一个缺点这是因为有时为了仅针对少数用例进行查询有时必须向域模型添加关联。 因此由于我不怕编写本机查询因此可以以DSL方式和独立于供应商的方式来执行此操作。 尽管可以使用基于字符串的列命名但JOOQ通过使用类型安全的元数据提供了一种更好的方法因此我们要做的第一件事是为数据库架构生成表映射。 由于我已经有了JPA模型因此可以从中生成数据库模式DDL为此我们可以使用hibernatetool ant任务。 plugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-antrun-plugin/artifactIdexecutionsexecutionidgenerate-test-sql-scripts/idphasegenerate-test-resources/phasegoalsgoalrun/goal/goalsconfigurationtasksproperty namemaven_test_classpath refidmaven.test.classpath/path idhibernate_tools_pathpathelement path${maven_test_classpath}//pathproperty namehibernate_tools_classpath refidhibernate_tools_path/taskdef namehibernatetoolclassnameorg.hibernate.tool.ant.HibernateToolTask/mkdir dir${project.build.directory}/test-classes/hsqldb/hibernatetool destdir${project.build.directory}/test-classes/hsqldbclasspath refidhibernate_tools_path/jpaconfiguration persistenceunittestPersistenceUnitpropertyfilesrc/test/resources/META-INF/spring/jdbc.properties/hbm2ddl dropfalse createtrue exportfalseoutputfilenamecreate_db.sqldelimiter; formattrue/hbm2ddl droptrue createfalse exportfalseoutputfilenamedrop_db.sqldelimiter; formattrue//hibernatetool/tasks/configuration/execution/executionsdependenciesdependencygroupIdorg.hibernate/groupIdartifactIdhibernate-entitymanager/artifactIdversion${hibernate.version}/versionexclusionsexclusiongroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactId/exclusion/exclusions/dependencydependencygroupIdorg.hibernate/groupIdartifactIdhibernate-tools/artifactIdversion${hibernate.tools.version}/versionexclusionsexclusiongroupIdorg.hibernate/groupIdartifactIdhibernate-commons-annotations/artifactId/exclusion/exclusions/dependencydependencygroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactIdversion${slf4j.version}/version/dependencydependencygroupIdorg.slf4j/groupIdartifactIdslf4j-simple/artifactIdversion${slf4j.version}/version/dependency/dependencies
/plugin 这将生成一个“ create_db.sql”数据库DDL脚本我们将使用“ maven.sql.plugin”将其用于填充基于文件的临时HSQLDB。 我本来希望使用内存中的HSQLDB但不幸的是它没有保存插件执行之间的状态。 plugingroupIdorg.codehaus.mojo/groupIdartifactIdsql-maven-plugin/artifactIddependenciesdependencygroupIdorg.hsqldb/groupIdartifactIdhsqldb/artifactIdversion${hsqldb.version}/version/dependency/dependenciesconfigurationdriverorg.hsqldb.jdbc.JDBCDriver/driverurljdbc:hsqldb:file:${project.build.directory}/hsqldb/db;shutdowntrue/urlusernamesa/usernamepassword/passwordautocommittrue/autocommitsettingsKeyhsql-db-test/settingsKey/configurationexecutionsexecutionidcreate-test-compile-data/idphaseprocess-test-resources/phaseinheritedtrue/inheritedgoalsgoalexecute/goal/goalsconfigurationorderFileascending/orderFilefilesetbasedir${project.build.directory}/test-classes/hsqldb//basedirincludesincludecreate_db.sql/include/includes/filesetautocommittrue/autocommit/configuration/execution/executions
/plugin 因此现在用我们的JPA生成的模式填充了HSQLDB我们最终可以调用JOOQ代码生成来构建表映射。 plugingroupIdorg.jooq/groupIdartifactIdjooq-codegen-maven/artifactIdexecutionsexecutionphaseprocess-test-classes/phasegoalsgoalgenerate/goal/goals/execution/executionsdependenciesdependencygroupIdorg.hsqldb/groupIdartifactIdhsqldb/artifactIdversion${hsqldb.version}/version/dependency/dependenciesconfigurationjdbcdriverorg.hsqldb.jdbc.JDBCDriver/driverurljdbc:hsqldb:file:${project.build.directory}/hsqldb/db/urlusersa/userpassword/password/jdbcgeneratornameorg.jooq.util.JavaGenerator/namedatabasenameorg.jooq.util.hsqldb.HSQLDBDatabase/nameincludes.*/includesexcludes/excludesinputSchemaPUBLIC/inputSchema/databasegenerate/generatetargetpackageNamevladmihalcea.jooq.schema/packageNamedirectorytarget/generated-sources/jooq/directory/target/generator/configuration
/plugin 通过maven运行我们生成了表映射因此让我们将Image类的JPA元模型与关联的JOOQ表映射进行比较 JPA元模型如下所示 StaticMetamodel(Image.class)
public abstract class Image_ {public static volatile SingularAttributeImage, Product product;public static volatile SingularAttributeImage, Long id;public static volatile SetAttributeImage, Version versions;public static volatile SingularAttributeImage, Integer index;public static volatile SingularAttributeImage, String name;} 和JOOQ表映射 javax.annotation.Generated(value { http://www.jooq.org, 3.2.0 },comments This class is generated by jOOQ)
java.lang.SuppressWarnings({ all, unchecked, rawtypes })
public class Image extends org.jooq.impl.TableImplvladmihalcea.jooq.schema.tables.records.ImageRecord {private static final long serialVersionUID 1596930978;/*** The singleton instance of codePUBLIC.IMAGE/code*/public static final vladmihalcea.jooq.schema.tables.Image IMAGE new vladmihalcea.jooq.schema.tables.Image();/*** The class holding records for this type*/Overridepublic java.lang.Classvladmihalcea.jooq.schema.tables.records.ImageRecord getRecordType() {return vladmihalcea.jooq.schema.tables.records.ImageRecord.class;}/*** The column codePUBLIC.IMAGE.ID/code. */public final org.jooq.TableFieldvladmihalcea.jooq.schema.tables.records.ImageRecord, java.lang.Long ID createField(ID, org.jooq.impl.SQLDataType.BIGINT.nullable(false), this);/*** The column codePUBLIC.IMAGE.INDEX/code. */public final org.jooq.TableFieldvladmihalcea.jooq.schema.tables.records.ImageRecord, java.lang.Integer INDEX createField(INDEX, org.jooq.impl.SQLDataType.INTEGER, this);/*** The column codePUBLIC.IMAGE.NAME/code. */public final org.jooq.TableFieldvladmihalcea.jooq.schema.tables.records.ImageRecord, java.lang.String NAME createField(NAME, org.jooq.impl.SQLDataType.VARCHAR.length(255), this);/*** The column codePUBLIC.IMAGE.PRODUCT_ID/code. */public final org.jooq.TableFieldvladmihalcea.jooq.schema.tables.records.ImageRecord, java.lang.Long PRODUCT_ID createField(PRODUCT_ID, org.jooq.impl.SQLDataType.BIGINT, this);/*** Create a codePUBLIC.IMAGE/code table reference*/public Image() {super(IMAGE, vladmihalcea.jooq.schema.Public.PUBLIC);}/*** Create an aliased codePUBLIC.IMAGE/code table reference*/public Image(java.lang.String alias) {super(alias, vladmihalcea.jooq.schema.Public.PUBLIC, vladmihalcea.jooq.schema.tables.Image.IMAGE);}/*** {inheritDoc}*/Overridepublic org.jooq.Identityvladmihalcea.jooq.schema.tables.records.ImageRecord, java.lang.Long getIdentity() {return vladmihalcea.jooq.schema.Keys.IDENTITY_IMAGE;}/*** {inheritDoc}*/Overridepublic org.jooq.UniqueKeyvladmihalcea.jooq.schema.tables.records.ImageRecord getPrimaryKey() {return vladmihalcea.jooq.schema.Keys.SYS_PK_10059;}/*** {inheritDoc}*/Overridepublic java.util.Listorg.jooq.UniqueKeyvladmihalcea.jooq.schema.tables.records.ImageRecord getKeys() {return java.util.Arrays.org.jooq.UniqueKeyvladmihalcea.jooq.schema.tables.records.ImageRecordasList(vladmihalcea.jooq.schema.Keys.SYS_PK_10059, vladmihalcea.jooq.schema.Keys.UK_OQBG3YIU5I1E17SL0FEAWT8PE);}/*** {inheritDoc}*/Overridepublic java.util.Listorg.jooq.ForeignKeyvladmihalcea.jooq.schema.tables.records.ImageRecord, ? getReferences() {return java.util.Arrays.org.jooq.ForeignKeyvladmihalcea.jooq.schema.tables.records.ImageRecord, ?asList(vladmihalcea.jooq.schema.Keys.FK_9W522RC4D0KFDKQ390IHV92GB);}/*** {inheritDoc}*/Overridepublic vladmihalcea.jooq.schema.tables.Image as(java.lang.String alias) {return new vladmihalcea.jooq.schema.tables.Image(alias);}
} 现在我们还需要使Maven意识到我们新生成的JOOQ元数据类以便它可以在下一个测试编译阶段对其进行编译。 plugingroupIdorg.codehaus.mojo/groupIdartifactIdbuild-helper-maven-plugin/artifactIdexecutionsexecutionidadd-source/idphaseprocess-test-sources/phasegoalsgoaladd-test-source/goal/goalsconfigurationsourcessource${project.build.directory}/generated-sources/java/source/sources/configuration/execution/executions
/plugin 现在我可以开始玩JOOQ了。 让我们将DSLContext添加到我们的Spring应用程序上下文中 bean idjooqContext classorg.jooq.impl.DSL factory-methodusingconstructor-arg refdataSource/constructor-arg value#{T(org.jooq.SQLDialect).HSQLDB}/
/bean 我们将编写一个测试来检查一切是否正常 private ListImageProductDTO getImageProductDTOs_JOOQ() {return transactionTemplate.execute(new TransactionCallbackListImageProductDTO() {Overridepublic ListImageProductDTO doInTransaction(TransactionStatus transactionStatus) {return jooqContext.select(IMAGE.NAME, PRODUCT.NAME).from(IMAGE).join(PRODUCT).on(IMAGE.PRODUCT_ID.equal(PRODUCT.ID)).where(PRODUCT.NAME.likeIgnoreCase(%tv%)).and(IMAGE.INDEX.greaterThan(0)).orderBy(IMAGE.NAME.asc()).fetch().into(ImageProductDTO.class);}});
} 生成以下SQL SELECT PUBLIC.image.name,PUBLIC.product.name
FROM PUBLIC.imageJOIN PUBLIC.productON PUBLIC.image.product_id PUBLIC.product.id
WHERE ( Lower(PUBLIC.product.name) LIKE Lower(%tv%)AND PUBLIC.image.index 0 )
ORDER BY PUBLIC.image.name ASC 这是我第一次使用JOOQ并且不需要花太多时间浏览文档并在Hibernate Facts编码示例中进行所有设置。 JOOQ查询的构建感觉很自然就像编写本机SQL代码一样因此我不必真正学习API就能知道如何使用它。 我将很自豪地将其添加到我的Java Data Toolbox中。 这个编码示例将JOOQ映射生成到test-classes文件夹中因此您不能在main / java源文件中使用它们。 这可以解决但是需要通过将模型类移动到单独的Maven模块中来重构现有解决方案。 您可以在此单独的模块中生成JOOQ模式在打包之前您可以在其中将模式类从测试类移至classes文件夹。 然后您将必须包含这个新模块通常在其中使用JOOQ模式。 参考 JOOQ事实从JPA注释到我们的JCG合作伙伴 Vlad Mihalcea在Vlad Mihalcea博客博客上的JOOQ 表映射 。 翻译自: https://www.javacodegeeks.com/2013/12/jooq-facts-from-jpa-annotations-to-jooq-table-mappings.htmljooq映射原理