使用 jdbc 的 Querydsl - Maven 配置(querydsl 插件不生成 Q class)
Querydsl with jdbc - Maven configuration(querydsl plugin doesn't generate Q class)
我想将 QueryDSL 与 JDBC(不是 JPA)一起使用。
所以在 pom.xml 中,我放置了这些依赖项和插件:
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-core</artifactId>
<version>3.7.4</version>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-sql</artifactId>
<version>3.7.4</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
....
<plugins>
<plugin>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-maven-plugin</artifactId>
<version>3.7.4</version>
<executions>
<execution>
<goals>
<goal>export</goal>
</goals>
</execution>
</executions>
<configuration>
<jdbc.url>jdbc:mysql://localhost:8889/chebuoni</jdbc.url>
<jdbc.driver>com.mysql.cj.jdbc.Driver</jdbc.driver>
<jdbcUser>root</jdbcUser>
<jdbcPassword>root</jdbcPassword>
<packageName>it.group.myproject</packageName>
<targetFolder>/target/generated-sources/java</targetFolder>
</configuration>
<dependencies>
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<version>10.13.1.1</version>
</dependency>
</dependencies>
</plugin>
</plugins>
Maven 仅当我以 generic-export 为目标时,Maven 才能毫无错误地进行构建,但在这种情况下,它不会创建我需要的 Q class为了使用 QueryDSL。
我还在包 it.group.myproject
中用注释 @Entity 映射了我的 class Person
************************ 编辑 **********************
按照@Nikolas 的提示,我终于能够生成 Q class,并且我在 pom 中添加了这个插件:
<plugin>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-maven-plugin</artifactId>
<version>4.1.0</version>
<configuration>
<jdbc.url>jdbc:mysql://localhost:8889/myDB</jdbc.url>
<jdbc.driver>com.mysql.cj.jdbc.Driver</jdbc.driver>
<jdbc.user>root</jdbc.user>
<jdbc.password>root</jdbc.password>
<packageName>myPackage</packageName>
<targetFolder>/target/generated-sources/java</targetFolder>
<namePrefix>S</namePrefix>
<imports>
<import>java.io</import>
<import>java.io.File</import>
</imports>
</configuration>
<dependencies>
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<version>10.13.1.1</version>
</dependency>
</dependencies>
</plugin>
但是,我仍然不知道如何配置 entityManager 的部分:
JPAQuery<?> queryFactory = new JPAQuery<Void>(entityManager);
我阅读了本教程 --> https://examples.javacodegeeks.com/enterprise-java/jpa/jpa-entitymanager-example/ 似乎我需要一个 persistence.xml 文件以便我可以执行此操作:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jcg-JPA");
EntityManager em = emf.createEntityManager();
所以我以这种方式配置了持久性和 entitymanager bean:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="jcg-JPA" />
</bean>
这是persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
版本="2.0">
<persistence-unit name="jcg-JPA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.connection.driver_class" value="com.mysql.cj.jdbc.Driver" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="root" />
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:8889/myDB" />
</properties>
</persistence-unit>
但是服务器启动失败:
org.apache.catalina.core.StandardContext listenerStart
GRAVE: Exception sending context initialized event to listener instance of class [org.springframework.web.context.ContextLoaderListener]
java.lang.NoSuchMethodError:
org.springframework.beans.factory.annotation.InjectionMetadata: method
<init>()V not found at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findPersistenceMetadata(PersistenceAnnotationBeanPostProcessor.java:351)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessMergedBeanDefinition(PersistenceAnnotationBeanPostProcessor.java:295)
你好像把一些东西搞混了,JDBC和JPA是两双不同的鞋,参考this post。这里不能没有 JPA,因为它有助于创建元模型。您甚至可以使用@Entity 自己引用它。您将同时使用 JDBC 和 JPA。
也就是说,您的图书馆已经过时了。 They restructured their package structure some time ago. 我猜这会导致 NPE,正如 Maven 插件所期望的那样 com.querydsl 类.
This is the current Git project。检查 .md 上的 maven 配置,这个应该可以工作。
This is the documentation to refer to.
(编辑)
EntityManager 通过 persistence.xml
我知道 "I don't want no Hibernate"- 感觉,此时您可能会发现适当的 JPA 实现很有用。您 可以 自己实施 JPA,但是...暂时不要这样做。无论如何,EntityManager 是 JPA-Territory。如果您不喜欢 Hibernate,请使用 EclipseLink。而是选择了一个。然后,按照有关如何设置 persistence.xml 的教程(在其中指定实体管理器工厂,引入持久性 类 并配置 DB-Connection ).然后您可以按照教程中提到的名称引用工厂。配置 JPA 超出了 QueryDSL-Tut 的范围,只是选择了 JPA-"Implementor" 提供的方法,它们相当不错。
Spring
检查 this post about setting up JPA the "Spring-Way",也许这就是您想要的。不过,它仍然需要您就 Hibernate 做出选择。这就是为什么我有点离开上面的段落。
(编辑2)
关于你的persistence.xml,我想你可能需要在你的xml中命名你所有的持久类(Another link, another Tutorial),在你指定none的那一刻,所以扫描仪没有找到任何。在 Spring 中,你可以指定 "packages to scan",它基本上做类似的工作。
我想将 QueryDSL 与 JDBC(不是 JPA)一起使用。 所以在 pom.xml 中,我放置了这些依赖项和插件:
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-core</artifactId>
<version>3.7.4</version>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-sql</artifactId>
<version>3.7.4</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
....
<plugins>
<plugin>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-maven-plugin</artifactId>
<version>3.7.4</version>
<executions>
<execution>
<goals>
<goal>export</goal>
</goals>
</execution>
</executions>
<configuration>
<jdbc.url>jdbc:mysql://localhost:8889/chebuoni</jdbc.url>
<jdbc.driver>com.mysql.cj.jdbc.Driver</jdbc.driver>
<jdbcUser>root</jdbcUser>
<jdbcPassword>root</jdbcPassword>
<packageName>it.group.myproject</packageName>
<targetFolder>/target/generated-sources/java</targetFolder>
</configuration>
<dependencies>
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<version>10.13.1.1</version>
</dependency>
</dependencies>
</plugin>
</plugins>
Maven 仅当我以 generic-export 为目标时,Maven 才能毫无错误地进行构建,但在这种情况下,它不会创建我需要的 Q class为了使用 QueryDSL。 我还在包 it.group.myproject
中用注释 @Entity 映射了我的 class Person************************ 编辑 ********************** 按照@Nikolas 的提示,我终于能够生成 Q class,并且我在 pom 中添加了这个插件:
<plugin>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-maven-plugin</artifactId>
<version>4.1.0</version>
<configuration>
<jdbc.url>jdbc:mysql://localhost:8889/myDB</jdbc.url>
<jdbc.driver>com.mysql.cj.jdbc.Driver</jdbc.driver>
<jdbc.user>root</jdbc.user>
<jdbc.password>root</jdbc.password>
<packageName>myPackage</packageName>
<targetFolder>/target/generated-sources/java</targetFolder>
<namePrefix>S</namePrefix>
<imports>
<import>java.io</import>
<import>java.io.File</import>
</imports>
</configuration>
<dependencies>
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<version>10.13.1.1</version>
</dependency>
</dependencies>
</plugin>
但是,我仍然不知道如何配置 entityManager 的部分:
JPAQuery<?> queryFactory = new JPAQuery<Void>(entityManager);
我阅读了本教程 --> https://examples.javacodegeeks.com/enterprise-java/jpa/jpa-entitymanager-example/ 似乎我需要一个 persistence.xml 文件以便我可以执行此操作:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jcg-JPA");
EntityManager em = emf.createEntityManager();
所以我以这种方式配置了持久性和 entitymanager bean:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="jcg-JPA" />
</bean>
这是persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 版本="2.0">
<persistence-unit name="jcg-JPA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.connection.driver_class" value="com.mysql.cj.jdbc.Driver" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="root" />
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:8889/myDB" />
</properties>
</persistence-unit>
但是服务器启动失败:
org.apache.catalina.core.StandardContext listenerStart
GRAVE: Exception sending context initialized event to listener instance of class [org.springframework.web.context.ContextLoaderListener]
java.lang.NoSuchMethodError:
org.springframework.beans.factory.annotation.InjectionMetadata: method
<init>()V not found at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findPersistenceMetadata(PersistenceAnnotationBeanPostProcessor.java:351)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessMergedBeanDefinition(PersistenceAnnotationBeanPostProcessor.java:295)
你好像把一些东西搞混了,JDBC和JPA是两双不同的鞋,参考this post。这里不能没有 JPA,因为它有助于创建元模型。您甚至可以使用@Entity 自己引用它。您将同时使用 JDBC 和 JPA。
也就是说,您的图书馆已经过时了。 They restructured their package structure some time ago. 我猜这会导致 NPE,正如 Maven 插件所期望的那样 com.querydsl 类.
This is the current Git project。检查 .md 上的 maven 配置,这个应该可以工作。
This is the documentation to refer to.
(编辑)
EntityManager 通过 persistence.xml
我知道 "I don't want no Hibernate"- 感觉,此时您可能会发现适当的 JPA 实现很有用。您 可以 自己实施 JPA,但是...暂时不要这样做。无论如何,EntityManager 是 JPA-Territory。如果您不喜欢 Hibernate,请使用 EclipseLink。而是选择了一个。然后,按照有关如何设置 persistence.xml 的教程(在其中指定实体管理器工厂,引入持久性 类 并配置 DB-Connection ).然后您可以按照教程中提到的名称引用工厂。配置 JPA 超出了 QueryDSL-Tut 的范围,只是选择了 JPA-"Implementor" 提供的方法,它们相当不错。
Spring
检查 this post about setting up JPA the "Spring-Way",也许这就是您想要的。不过,它仍然需要您就 Hibernate 做出选择。这就是为什么我有点离开上面的段落。
(编辑2) 关于你的persistence.xml,我想你可能需要在你的xml中命名你所有的持久类(Another link, another Tutorial),在你指定none的那一刻,所以扫描仪没有找到任何。在 Spring 中,你可以指定 "packages to scan",它基本上做类似的工作。