标签: jooq

jOOQ复杂更新 - 如何锁定表?

这是嵌套集模型的"添加节点"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)

sql nested-set-model jooq

3
推荐指数
1
解决办法
1930
查看次数

JOOQ未配置连接问题

我正在使用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中给出异常:无法执行查询。未配置连接

但是数据库连接没有螺母,这可能是什么原因?
(某些查询使用相同的连接)

java mysql jooq

3
推荐指数
1
解决办法
2802
查看次数

限制和偏移量的jooq问题

我已经将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方法的值未附加到查询中。

我搜索了文档,但没有找到其他实现此目的的方法。

java spring jdbctemplate bind-variables jooq

3
推荐指数
1
解决办法
1740
查看次数

JOOQ与SQL Server

我是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类的定义.

JOOQ反编译

我正在编译:

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)

java sql-server jooq

3
推荐指数
1
解决办法
3351
查看次数

JOOQ如何从表中选择最小的“ id”

在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()函数,但是语法不正确。

java sql jooq

3
推荐指数
1
解决办法
3867
查看次数

jOOQ - 方法调用

我有关于在以下示例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

java sql methods invoke jooq

3
推荐指数
1
解决办法
171
查看次数

用jooq选择条件

在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做到这一点?

java sql jooq

3
推荐指数
1
解决办法
900
查看次数

JOOQ和Logback

我将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网站上获得任何有关此内容的指示。

java logging logback jooq spring-boot

3
推荐指数
1
解决办法
2683
查看次数

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

java arrays postgresql jooq

3
推荐指数
1
解决办法
305
查看次数

NOOP在JOOQ中

我提供一种在对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操作代替它。

java jooq kotlin

3
推荐指数
1
解决办法
75
查看次数