使用jdbc的Querydsl - Maven配置(querydsl插件不会生成Q类)

时间:2017-09-20 07:25:07

标签: java maven jdbc querydsl

我想将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>

只有当我以 generic-export 作为目标时,Maven才能正确地构建它,但在这种情况下,它不会创建我需要的Q类来使用QueryDSL。 我还在包it.group.myproject

中使用注释@Entity映射了我的类Person

**********************编辑********************** 关于@Nikolas提示我终于能够生成Q类了,我在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);

我读了这个教程 - &gt; https://examples.javacodegeeks.com/enterprise-java/jpa/jpa-entitymanager-example/我似乎需要一个persistence.xml文件,以便我可以这样做:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("jcg-JPA");
    EntityManager em = emf.createEntityManager();

所以我用这种方式配置了持久性和实体管理器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"         版本=&#34; 2.0&#34;&GT;

    <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)

1 个答案:

答案 0 :(得分:0)

你似乎在这里混淆了一些东西,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

(编辑)

通过persistence.xml的EntityManager

我知道&#34;我不想要Hibernate&#34; - 感觉,此时你可能会发现一个合适的JPA-Implementation非常有用。您可以自己实施JPA,但是......不要这样做。无论如何, EntityManager 是JPA-Territory。如果您不喜欢Hibernate,请使用EclipseLink。但选择了一个。然后,按照有关如何设置 persistence.xml 的教程(在其中指定实体管理器工厂,介绍持久化类并配置DB-Connection)。然后您可以按照您提到的教程的名称参考工厂。配置JPA超出了QueryDSL-Tut的范围,只是选择了如何操作JPA - &#34; Implementor&#34;提供,他们相当不错。

<强>弹簧
检查this post about setting up JPA the "Spring-Way",也许这就是你想要的。不过,它仍然需要您在Hibernate方面做出选择。这就是为什么我有点离开上面的段落。

(EDIT2) 关于你的persistence.xml,我认为你可能需要在xml中命名所有持久化类(Another link, another Tutorial),此时你没有指定,所以扫描器找不到任何。在Spring中,您可以指定扫描&#34;包,这基本上可以完成类似的工作。