我已经刷新了我的项目,干净地重建了它,用Google搜索/搜索了StackOverflow以查找类似问题,阅读了jOOQ文档,检查了构建输出是否存在潜在问题等.
我<daos>在我的pom.xml中添加了一个标志来生成jOOQ数据库访问对象,因为jOOQ 3.2.0在线手册说 "可以使用daos标志激活DAO生成".根据jOOQ Advanced Codegen 文档将此标志设置为true,不仅会生成DAO,还会生成关系,记录和POJO:
<generator>
...
<generate>
<daos>true</daos>
</generate>
</generator>
Run Code Online (Sandbox Code Playgroud)
在将标志添加到我的pom之前,我有自动生成的记录和关系,但既没有POJO也没有DAO.添加daos标志并重建我的项目后,我还有POJO加上另外两个,但我仍然没有任何DAO.附带的屏幕截图显示了我生成的类.标志添加的类位于蓝色框中.我认为应该有一个名为"daos"的包,包含PurchaseDAO和UserDAO类.
jOOQ DAO 文档没有解释添加标志但未生成DAO的任何情况.该项目的部分重点是学习jOOQ,因此使用jOOQ类手动编码DAO无法解决我的问题.
编辑:我的SQLite从工作3.7.11模式和非工作的解决方案是在这里.
这就是我实现我想要的每个jooq查询的方法.
UtilClass{
//one per table more or less
static void methodA(){
//my method
Connection con = MySQLConnection.getConexion(); //open
DSLContext create = DSL.using(con, SQLDialect.MYSQL); //open
/* my logic and jooq querys */ //The code !!!!!!!
try {
if ( con != null )
con.close(); //close
} catch (SQLException e) {
} //close
con=null; //close
create=null; //close
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里过度工作吗?/保持上下文和连接打开是否安全?
如果保持打开是安全的,我宁愿使用1个静态字段DSLContext per UtilClass(并且只有评论的部分将在我的方法上).我将为每个UtilClass打开一个连接,因为我封装了每个表的方法(或多或少).
我有一个表格实验和一个表格标签.一个实验可能有许多标签.模式:
-------- --------
|Table1| 1 n |Table2|
| | <--------------> | |
| | | |
-------- --------
(experiment) (tags)
Run Code Online (Sandbox Code Playgroud)
是否可以使用jooq创建查询,返回实验和相应的标记列表.类似于结果,其中Record是一个experimentRecord,一个标签列表或一个地图.
我也有一个只返回一个结果的查询,那里有什么方便吗?
编辑:java8,最新的jooq.
向jOOQ用户组报告了以下错误.它似乎是javac编译器中的一个错误,它与编译器在使用内部DSL(如jOOQ)的上下文中完成的"复杂"类型推理工作有关.
鉴于bug的一般性质,我在Stack Overflow上记录它,以便其他人帮助应用变通方法.在高层次上,由于JEP 101:广义目标类型推断,它似乎是编译器性能回归,它是在Java 8中引入的,并且在过去已经引起了1-2个问题.
使用Maven和jOOQ 3.7在Windows上使用jdk 1.8.0_60或1.8.0_66编译以下相对无害的类大约需要20秒:
import static org.jooq.impl.DSL.field;
import org.jooq.SQLDialect;
import org.jooq.impl.DSL;
public class Test {
public void method() {
DSL.using(SQLDialect.MYSQL)
.select()
.where(DSL.trueCondition())
.and(field("client.id").eq(field("client_id")))
.and(field("client.id").eq(field("client_id")))
.and(field("client.id").eq(field("client_id")))
.and(field("client.id").eq(field("client_id")))
.and(field("client.id").eq(field("client_id")))
.and(field("client.id").eq(field("client_id")))
.and(field("client.id").eq(field("client_id")))
.and(field("client.id").eq(field("client_id")))
.and(field("client.id").eq(field("client_id")))
.and(field("client.id").eq(field("client_id")))
;
}
}
Run Code Online (Sandbox Code Playgroud)
pom.xml中:
<project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>compilation-issues</groupId>
<artifactId>compilation-issues</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq</artifactId>
<version>3.7.1</version>
</dependency>
</dependencies>
</project>
Run Code Online (Sandbox Code Playgroud)
我如何解决我使用jooq-maven-plugin 3.7.3,Maven 3.3.9,Java 1.8.0_51和OS X 10.10.4获得的NullPointerException?
[错误]未能执行目标org.jooq:jooq-CODEGEN-行家:3.7.3:生成(默认CLI)项目我-应用程序:错误运行jOOQ代码生成工具:NullPointerException异常 - > [求助1] org.apache .maven.lifecycle.LifecycleExecutionException:无法执行目标org.jooq:jooq-codegen-maven:3.7.3:在项目my-app上生成(default-cli):在org.apache.maven上运行jOOQ代码生成工具时出错. org.apache.maven.life.internal.MojoExecutor.execute中的org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)中的lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212) MojoExecutor.java:145)org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)at org .apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)在org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)org.apache.maven.maven.DefaultMaven.doExecute(DefaultMaven.java:307)org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)atg.apache.maven .defaultMaven.execute(DefaultMaven.java:106)org.apache.maven.cli.MavenCli.execute(MavenCli.java:863)org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)at at org.apache.maven.cli.MavenCli.main(MavenCli.java:199)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.委托在org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)的orgkeAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)atg.cathaus.plexus.invoke(Method.java:497) .codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)位于org.codehaus.plexus.classworlds.l的org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)auncher.Launcher.main(Launcher.java:356)引起:org.apache.maven.plugin.MojoExecutionException:在org.jooq.util.maven.Plugin.execute(Plugin.java:134)上运行jOOQ代码生成工具时出错在org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207)... 20更多引起:java. org.jooq.util.maven.Plugin.execute(Plugin.java:118)的lang.NullPointerException ... 22更多
String dir = generator.getTarget().getDirectory();
Run Code Online (Sandbox Code Playgroud)
我在下面配置的目标目录确实存在,我尝试了相对路径和绝对路径以及不使用属性来设置它.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>my-app</name>
<url>http://maven.apache.org</url>
<properties>
<db>myappdb</db>
<db.driver>com.mysql.jdbc.Driver</db.driver>
<db.jdbc>jdbc:mysql://localhost</db.jdbc>
<db.url>${db.jdbc}/${db}</db.url>
<db.user>root</db.user>
<db.pass>rootpass</db.pass>
<jaxb-api.version>2.2.6</jaxb-api.version>
<jooq.version>3.7.3</jooq.version>
<jooq.dialect>org.jooq.util.mysql.MySQLDatabase</jooq.dialect>
<jooq.gen.directory>target</jooq.gen.directory>
<jooq.gen.package>com.mycompany.app.jooq</jooq.gen.package>
<junit.version>3.8.1</junit.version>
<mysql.driver.version>5.1.38</mysql.driver.version>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen-maven</artifactId>
<version>${jooq.version}</version>
<executions>
<execution>
<id>jooq-generate</id>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
<configuration> …Run Code Online (Sandbox Code Playgroud) List<MyTable> result = DSL.using(configuration())
.select()
.from(MY_TABLE)
.where(MY_TABLE.ID1.equal(pk_id1))
.and(MY_TABLE.ID2.equal(fk_id2))
.and(MY_TABLE.ID3.equal(fk_id3))
.orderBy(MY_TABLE.ID.asc())
.limit(limit)
.fetchInto(MY_TABLE)
.map(mapper());
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写一些代码,允许我的查询采用三个可选的id,例如我希望查询最终成为
select * from my_table where ID1=5 and ID2=6 and ID3=7 .... etc
Run Code Online (Sandbox Code Playgroud)
但是,我还想选择能够排除任何id
select * from my_table where ID2=6 and ID3=7
Run Code Online (Sandbox Code Playgroud)
要么
select * from my_table where ID3=7
Run Code Online (Sandbox Code Playgroud)
这个问题是第一个"where"子句属于id 1,其余的是ands所以如果我做了一个if语句并且我删除了那里然后我会留下
List<MyTable> result = DSL.using(configuration())
.select()
.from(MY_TABLE)
.and(MY_TABLE.ID2.equal(fk_id2))
.and(MY_TABLE.ID3.equal(fk_id3))
.orderBy(MY_TABLE.ID.asc())
.limit(limit)
.fetchInto(MY_TABLE)
.map(mapper());
Run Code Online (Sandbox Code Playgroud)
它不会起作用.
我试图寻找类似于where id = **are essentianlly没有过滤器的东西,但我找不到那样的东西.
我想用jOOQ构建和执行这样的查询.
SELECT EXISTS( subquery )
Run Code Online (Sandbox Code Playgroud)
举个例子:
SELECT EXISTS(SELECT 1 FROM icona_etiqueta WHERE pvp IS NULL AND unitat_venda = 'GRAMS')
Run Code Online (Sandbox Code Playgroud)
我该怎么做?可以吗?
我刚刚将我的项目表单JDK8升级到JDK9.我使用JOOQ库版本3.9.5.我现在在编译时看到这个错误.
[ERROR] Failed to execute goal org.jooq:jooq-codegen-maven:3.9.5:generate (default) on project myproject-db-model: Execution default of goal org.jooq:jooq-codegen-maven:3.9.5:generate failed: A required class was missing while executing org.jooq:jooq-codegen-maven:3.9.5:generate: javax/xml/bind/JAXB
[ERROR] -----------------------------------------------------
[ERROR] realm = plugin>org.jooq:jooq-codegen-maven:3.9.5
[ERROR] strategy = org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy
[ERROR] urls[0] = file:/Users/jeanvaljean/.m2/repository/org/jooq/jooq-codegen-maven/3.9.5/jooq-codegen-maven-3.9.5.jar
[ERROR] urls[1] = file:/Users/jeanvaljean/.m2/repository/org/postgresql/postgresql/42.1.1/postgresql-42.1.1.jar
[ERROR] urls[2] = file:/Users/jeanvaljean/Workspace/MyProjects/myproject/model/dbms-strategies/target/myproject-dbms-strategies-0.2.0-SNAPSHOT.jar
[ERROR] urls[3] = file:/Users/jeanvaljean/.m2/repository/org/springframework/boot/spring-boot-starter-data-jpa/1.5.7.RELEASE/spring-boot-starter-data-jpa-1.5.7.RELEASE.jar
[ERROR] urls[4] = file:/Users/jeanvaljean/.m2/repository/org/springframework/boot/spring-boot-starter/1.5.7.RELEASE/spring-boot-starter-1.5.7.RELEASE.jar
[ERROR] urls[5] = file:/Users/jeanvaljean/.m2/repository/org/springframework/boot/spring-boot/1.5.7.RELEASE/spring-boot-1.5.7.RELEASE.jar
[ERROR] urls[6] = file:/Users/jeanvaljean/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/1.5.7.RELEASE/spring-boot-autoconfigure-1.5.7.RELEASE.jar
[ERROR] urls[7] = file:/Users/jeanvaljean/.m2/repository/org/springframework/boot/spring-boot-starter-logging/1.5.7.RELEASE/spring-boot-starter-logging-1.5.7.RELEASE.jar
[ERROR] urls[8] = file:/Users/jeanvaljean/.m2/repository/ch/qos/logback/logback-classic/1.1.11/logback-classic-1.1.11.jar
[ERROR] urls[9] = file:/Users/jeanvaljean/.m2/repository/ch/qos/logback/logback-core/1.1.11/logback-core-1.1.11.jar
[ERROR] urls[10] = file:/Users/jeanvaljean/.m2/repository/org/slf4j/log4j-over-slf4j/1.7.25/log4j-over-slf4j-1.7.25.jar …Run Code Online (Sandbox Code Playgroud) 我试图使用jOOQ动态构建查询.到目前为止它确实很顺利,但现在我偶然发现了一个我似乎无法表达的案例.
这是我想要生成的查询的简化版本:
Select alias.*, otherAlias.aColumn as aAlias
From table as alias
inner join otherTable as otherAlias
on alias.someColumn = otherAlias.someOtherColumn
Where otherAlias.someOtherColumn in (????????)
Run Code Online (Sandbox Code Playgroud)
我的问题是我似乎无法表达我需要它的SELECT部分.如果我只是使用:
.select() -> I get select *
.select(alias.fields()) -> I get Select *
.select((alias.fields() :+ field(name(otherAlias, aColumn)).as(aAlias)):_*) -> I get Select otherAlias.aColumn as aAlias
Run Code Online (Sandbox Code Playgroud)
有没有办法用jOOQ表达这个?
声明的其余部分似乎按预期工作.我现在在Scala中使用jOOQ 3.10.7并且目标是Postgres,我的声明目前看起来像这样:
sql
.select()
.from(alias)
.innerJoin(otherAlias)
.on(field(name(alias, someColumn)).eq(field(name(otherAlias, someOtherColumn))))
.where(condition)
Run Code Online (Sandbox Code Playgroud)
非常感谢.
更新:我找到了一种方法来表达这种似乎通过回退到纯SQL的方式.但我仍然想知道是否有更好的方式来表达这一点.这作为选择:
.select((field(""""Alias".*"""), field(name(otherAlias, aColumn)).as(aAlias)):_*) -> I get Select "Alias".*, otherAlias.aColumn as aAlias
Run Code Online (Sandbox Code Playgroud) 我有 type 的列timestamp with time zone。该表包含以下值“2022-06-30 22:56:29.183764 +00:00”。我想做一个仅限日期的搜索。
如何在jooq中仅按日期(没有时间)进行比较?
我已经尝试过这个,但它不起作用。
.where(MY_TABLE.UPDATED_AT.cast(LocalDate::class.java).eq(cashDate))
Run Code Online (Sandbox Code Playgroud)
在哪里cashDate = "2022-06-30"