这是嵌套集模型的"添加节点"SQL查询
LOCK TABLE mytestdb.tbltree WRITE;
SELECT @myRight := rgt FROM mytestdb.tbltree
WHERE name = 'apples';
UPDATE mytestdb.tbltree SET rgt = rgt + 2 WHERE rgt > @myRight;
UPDATE mytestdb.tbltree SET lft = lft + 2 WHERE lft > @myRight;
INSERT INTO mytestdb.tbltree(name, lft, rgt)
VALUES('beans', @myRight + 1, @myRight + 2);
UNLOCK TABLES;
Run Code Online (Sandbox Code Playgroud)
并映射到jOOQ
Record record = create.select(Tbltree.RGT)
.from(Tbltree.TBLTREE)
.where(Tbltree.NAME.equal("apples"))
.fetchOne();
int myright = record.getValue(Tbltree.RGT);
create.update(Tbltree.TBLTREE).set(Tbltree.RGT, Tbltree.RGT.add(2))
.where(Tbltree.RGT.greaterThan(myright)).execute();
create.update(Tbltree.TBLTREE).set(Tbltree.LFT, Tbltree.LFT.add(2))
.where(Tbltree.LFT.greaterThan(myright)).execute();
TbltreeRecord record2 = (TbltreeRecord) create
.insertInto(Tbltree.TBLTREE, Tbltree.NAME, Tbltree.LFT, Tbltree.RGT) …Run Code Online (Sandbox Code Playgroud) 我正在使用JOOQ向MySql插入一条记录,这是我的代码
if (f.getConnection()!=null) {
UserRecord us = new UserRecord();
us.setAccountId(UInteger.valueOf(accountId));
us.setCode(code);
us.setEnd(new java.sql.Date(end.getTime()));
us.setStart(new java.sql.Date(start.getTime()));
us.setPhoneNumberId(UInteger.valueOf(phnNUmberId));
us.store();
}
Run Code Online (Sandbox Code Playgroud)
(f是数据库连接工厂类)
它
在线程“ main” org.jooq.exception.DetachedException中给出异常:无法执行查询。未配置连接
但是数据库连接没有螺母,这可能是什么原因?
(某些查询使用相同的连接)
我已经将jooq与spring集成在一起,并且对于所有类型的数据库查询(MySQL),我都使用spring的JDBC模板。这里使用jooq库来生成传递给jdbc模板的sql查询。
尽管我的其余查询工作正常,直到我向查询添加限制和/或偏移量为止。
我正在生成查询,如下所示:
create.select(Factory.field("table_name"))
.from("tables t")
.where("t.table_schema LIKE '" + schemaName + "'")
.limit(10)
.offset(2)
.getSQL();
Run Code Online (Sandbox Code Playgroud)
我收到如下错误:
org.springframework.jdbc.BadSqlGrammarException:StatementCallback; 错误的SQL语法[从表t中选择table_name,其中(t.table_schema LIKE'test')有限制吗?偏移量?]; 嵌套的异常是com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法有错误。检查与您的MySQL服务器版本相对应的手册,以获取在'?附近使用的正确语法。抵消了?在第1行
显然,传递给limit和offset方法的值未附加到查询中。
我搜索了文档,但没有找到其他实现此目的的方法。
我是ORM的忠实粉丝,特别是涉及.NET with Entity Framework并使用LINQ使您的数据访问变得不那么繁琐和愉快.
但是,我目前正在研究Java,特别是关注ORM.我已经尝试过针对我们的SQL Server数据库的nHybernate - 并且由于某些表上没有键(唯一约束),我开始关注JOOQ.
我已经设法从SQL Server数据库生成我的Java类 - 但并非没有错误 - 使用JOOQ(v3.2.0).
根据这个页面JOOQ Connections,它提到了一个类org.jooq.util.sqlserver.SQLServerDatabase.但是当我在配置中生成这个时,我得到了class not found异常并且没有生成任何内容.我不得不使用org.jooq.util.jdbc.JDBCDatabase来生成我的代码.
这是我的配置文件(myjooqdbconfig.xml):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration xmlns="http://www.jooq.org/xsd/jooq-codegen-3.2.0.xsd">
<jdbc>
<driver>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver>
<url>jdbc:sqlserver://MYSERVER:1433;DatabaseName=MYDB</url>
<user>MYUSER</user>
<password>PWD</password>
</jdbc>
<generator>
<name>org.jooq.util.DefaultGenerator</name>
<database>
<name>org.jooq.util.jdbc.JDBCDatabase</name>
<inputSchema>dbo</inputSchema>
<includes>.*</includes>
<excludes></excludes>
</database>
<target>
<packageName>com.quorum.sentinel.dataAccess</packageName>
<directory>F:\Libraries\jooq\jOOQ-3.2.0\lib\gen</directory>
</target>
</generator>
</configuration>
Run Code Online (Sandbox Code Playgroud)
在找不到类的异常的情况下,我使用Java Decompiler查看了JAR文件jooq-meta-3.2.0.jar,它将显示这些类所在的位置.我看不到org.jooq.util.sqlserver.SQLServerDatabase类的定义.

我正在编译:
java -classpath jooq-3.2.0.jar; jooq-meta-3.2.0.jar; jooq-codegen-3.2.0.jar; sqljdbc4.jar;.org.jooq.util.GenerationTool /myjooqdbconfig.xml
这个org.jooq.util.sqlserver.SQLServerDatabase定义是否存在于任何JAR中?
另外,从上面的配置生成代码后,似乎需要很长时间,并且似乎处于某种循环中.
查看dbo下的生成文件 - Keys/Tables/Dbo,当我将文件复制到Netbeans项目(很多错误)时,我注意到了我的表的重复名称.我删除了重复项,到目前为止很好,我可以在下面的代码中从数据库中读取各种表:
public static void main(String[] args) {
Connection conn = null;
String userName = "MYUSER";
String password = "PWD"; …Run Code Online (Sandbox Code Playgroud) 在MySQL中,我想执行这样的查询
SELECT MIN(id) FROM table;
Run Code Online (Sandbox Code Playgroud)
我越了解JOOQ语法和聚合函数,就会感到困惑。
我以为这样的事情会起作用
select( EVENT.EVENTID , min() ).from( EVENT ).fetch();
or
Result<Integer> er = context.select( EVENT.EVENTID.min()).fetch();
Run Code Online (Sandbox Code Playgroud)
我尝试通过选择整个第一条记录来解决问题
Result<EventRecord> er2 = context.selectFrom(EVENT).orderBy(EVENT.EVENTID.asc()).limit(1).fetch();
Run Code Online (Sandbox Code Playgroud)
如果结果的大小为0,则说明一条记录不存在,但是如果结果不为0,则得到正确的记录。我想使用min()函数,但是语法不正确。
我有关于在以下示例jOOQ语句中调用方法count()的问题:
create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, count())
.from(AUTHOR)
.join(BOOK).on(AUTHOR.ID.equal(BOOK.AUTHOR_ID))
.where(BOOK.LANGUAGE.eq("DE"))
.and(BOOK.PUBLISHED.gt(date("2008-01-01")))
.groupBy(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
.having(count().gt(5))
.orderBy(AUTHOR.LAST_NAME.asc().nullsFirst())
.limit(2)
.offset(1)
.forUpdate()
.of(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
Run Code Online (Sandbox Code Playgroud)
我试图创建这样的机制来调用方法而不使用对象/类引用,但我放弃了.它真的有可能实现吗?
感谢帮助.
Wicia
在SQL中,我可以执行类型的查询:
SELECT cost > 1000 AS above_k, name FROM products;
Run Code Online (Sandbox Code Playgroud)
给我一个清单:
+---------+--------+
| above_k | name |
+---------+--------+
| true | Gold |
| false | Silver |
+---------+--------+
Run Code Online (Sandbox Code Playgroud)
如何使用jooq?建模类似的查询?我不能这样做(显然):
ctx.select(Tables.PRODUCTS.COST.gt(1000))
Run Code Online (Sandbox Code Playgroud)
既然,没有方法select(Condition condition).或者,如果我只是想:
SELECT cost*0.9 AS discounted_cost FROM products;
Run Code Online (Sandbox Code Playgroud)
有没有办法用jooq做到这一点?
我将springBoot与JOOQ一起使用,并希望记录生成的SQL。
像在JOOQ文档(http://www.jooq.org/doc/latest/manual/sql-execution/logging/)中一样,我将slf4J添加到了我的maven依赖项和log4j.xml中。但是当jooq执行一些查询时,我的控制台中看不到任何日志。
我也在Google中搜索此问题,但找不到任何内容。SpringBoot使用logBack,所以我的路径中有logBack和slf4J。是否可以对JOOQ使用logBack?我没有在JOOQ网站上获得任何有关此内容的指示。
jOOQ是否支持select查询数组?我想要以下内容:
select table.*, array(select another_table.id from another_table where ...)
from table;
Run Code Online (Sandbox Code Playgroud)
我试过试验,DSL.array(context.select(...).asField())但这产生array[(select ...)]而不是array(select(...)).
我提供一种在对books表进行查询时允许多个过滤选项的方法。查询的第一部分要么搜索所有书籍,要么仅搜索当前用户拥有的书籍。
val allBookQuery = if(searchParameters.isOnShelf == true) {
val context = environment.getContext<AuthorizedContext>()
context?.currentUser ?: throw GraphQLException("No Current User Authenticated")
val userUUID = UUID.fromString(context.currentUser.uuid)
select.from(BOOKS, USER_BOOKS, USERS)
.where(USERS.UUID.eq(userUUID))
.and(USERS.ID.eq(USER_BOOKS.USER_ID))
.and(USER_BOOKS.BOOK_ID.eq(BOOKS.ID))
.and(BOOKS.IS_ARCHIVED.eq(false))
} else {
select.from(BOOKS).where(true)
}
Run Code Online (Sandbox Code Playgroud)
该.where(true)表达式用于保持类型allBookQuery一致,以便以后我可以附加其他条件而不检查类型。
val filteredBooksQuery = if (searchParameters.bookIds != null) {
allBookQuery.and(BOOKS.ID.`in`(searchParameters.bookIds))
} else {
allBookQuery
}
val finalQuery = if (searchParameters.isAcademic == true) {
filteredBooksQuery.and(BOOKS.IS_ACADEMIC.eq((true)))
} else {
filteredBooksQuery
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,该where(Boolean)方法已被弃用。因此,尽管现在可以使用,但我想用不推荐使用的NOOP操作代替它。
jooq ×10
java ×9
sql ×4
arrays ×1
invoke ×1
jdbctemplate ×1
kotlin ×1
logback ×1
logging ×1
methods ×1
mysql ×1
postgresql ×1
spring ×1
spring-boot ×1
sql-server ×1