标签: jooq

在jooq中检索selectCount的值

我有一些看起来像这样的代码:

Record record = jooq
    .selectCount()
    .from(USERS)
    .fetchOne();
Run Code Online (Sandbox Code Playgroud)

目前我正在做以下事情以获得计数:

Integer count = (Integer) record.getValue(0);
Run Code Online (Sandbox Code Playgroud)

但似乎必须有一个更好的解决方案(这是类型安全的......因为这是使用jooq的全部意义).有什么建议?

java sql jooq

6
推荐指数
1
解决办法
4133
查看次数

为什么JOOQ限制为Integer值而不是Longs?

我是新与JOOQ,似乎有点奇怪,为什么它有很多我的专栏类型萨法德为整数,而他们可以很容易地需要在不久的将来多头.

甚至count(*)结果必须输入整数!

是否有设置将Long作为默认值或以任何方式在当前项目中全局设置Long?(只要这可能适用)

如果这是不可能的..是否有理由将其作为整数?'

这是一些代码的示例Scala:

def loggedInUserOwnsAccount(userId: Long) = {
selectCount().
  from(LOGGED_IN, EMAIL_ACCOUNT).
  where(LOGGED_IN.USER_ID.equal(EMAIL_ACCOUNT.PASS_ID)).
  and(LOGGED_IN.USER_ID.equal(userId.toInt)).asInstanceOf[ResultQuery[Record]]
}
Run Code Online (Sandbox Code Playgroud)

请注意,重要的部分是我需要使用此代码将Long转换为Int userId.toInt,否则将无法编译

java sql integer jooq long-integer

6
推荐指数
1
解决办法
1277
查看次数

jooq转换器:从java.sql.Date到java.time.LocalDate

我试过写一个Converter<java.sql.Date, java.time.LocalDate>但我不能让它与所有时区设置一起工作.

想法:

  • 如果客户端代码有一个LocalDate,例如2014年8月20日,并将其保存到数据库,则无论客户端时区是什么,它都应该在数据库中显示为2014年8月20日.
  • 如果数据库包含2014年8月20日的日期,则无论客户端时区是什么,客户端都应收到2014年8月20日的LocalDate.

我的测试:

@Test public void dateConverter() {
  for (int offset = -12; offset <= 12; offset++) {
    TimeZone localTz = TimeZone.getTimeZone(ZoneOffset.ofHours(offset));
    TimeZone.setDefault(localTz);
    LocalDate ld = LocalDate.now();

    sql.insertInto(DATE_TEST).set(new DateTestRecord(ld)).execute();
    LocalDate savedLd = sql.selectFrom(DATE_TEST).fetchOne(DATE_TEST.DATE_);
    assertEquals(savedLd, ld, "offset=" + offset);
    sql.delete(DATE_TEST).execute();
  }
}
Run Code Online (Sandbox Code Playgroud)

我的转换器:

public class DateConverter implements Converter<Date, LocalDate>{
  @Override public LocalDate from(Date date) { return date.toLocalDate(); }
  @Override public Date to(LocalDate ld) { return Date.valueOf(ld); }
  @Override public Class<Date> fromType() { return Date.class; …
Run Code Online (Sandbox Code Playgroud)

java sql jdbc jooq java-time

6
推荐指数
1
解决办法
3735
查看次数

如何在jOOQ中避免表别名的引号

我有以下选择查询创建:

final DSLContext create = DSL.using(..., SQLDialect.POSTGRES);

create
 .select(DSL.field("identifier"), DSL.field("name"), 
         create.selectCount()
               .from(DSL.table("person"))
               .where(DSL.field("identifier").eq(DSL.field("personOuter.identifier")))
               .asField("count"))
 .from(DSL.table("person").as("personOuter"))
Run Code Online (Sandbox Code Playgroud)

jOOQ生成以下查询:

select 
    identifier, 
    name, 
   (select count(*) 
    from person 
    where identifier = personOuter.identifier) as "count" 
from person as "personOuter"
Run Code Online (Sandbox Code Playgroud)

查询应该是:

select 
    identifier, 
    name, 
   (select count(*) 
    from person 
    where identifier = personOuter.identifier) as "count" 
from person as personOuter
Run Code Online (Sandbox Code Playgroud)

后一种查询在PostgreSQL中完美运行.表别名不应该用引号括起来.

这是一个错误吗?

(请注意,查询非常愚蠢.我正在玩jOOQ进行评估.)

以下"黑客"有效:

create
 .select(DSL.field("identifier"), DSL.field("name"), 
         create.selectCount()
               .from(DSL.table("person"))
               .where(DSL.field("identifier").eq(DSL.field("personOuter.identifier")))
               .asField("count"))
 .from("person as personOuter")
Run Code Online (Sandbox Code Playgroud)

java sql alias jooq

6
推荐指数
1
解决办法
2226
查看次数

使用jOOQ创建包含主键的表

jOOQ具有文档中所述的 CREATE TABLE语法:

create.createTable(AUTHOR)
      .column(AUTHOR.ID, SQLDataType.INTEGER)
      .column(AUTHOR.FIRST_NAME, SQLDataType.VARCHAR.length(50))
      .column(AUTHOR_LAST_NAME, SQLDataType.VARCHAR.length(50))
      .execute();
Run Code Online (Sandbox Code Playgroud)

我想知道如何定义哪个列属于主键?那么在jOOQ中有没有办法用PRIMARY KEY信息创建一个CREATE TABLE语句?

我对SQLite的解决方案特别感兴趣,后来没有语法来添加主键,所以我认为在最坏的情况下我必须转到特定于DB的解决方案?

java sqlite jooq

6
推荐指数
1
解决办法
3405
查看次数

使用postgres和jOOQ的全文搜索和变量绑定不起作用

我正在尝试使用jOOQ在postgres数据库中进行全文搜索.以下行有效:

Result res = pgContext.select()
                      .from(products.PRODUCTS)
                      .where("to_tsvector(title || ' ' || description || ' ' || tags) @@ to_tsquery('" + query + "')")
                      .fetch();
Run Code Online (Sandbox Code Playgroud)

但是当我添加变量绑定时,为了防止SQL注入,我不再获得结果:

Result res = pgContext.select()
                      .from(products.PRODUCTS)
                      .where("to_tsvector(title || ' ' || description || ' ' || tags) @@ to_tsquery('?')", query)
                      .fetch();
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

谢谢,美好的一天

java sql postgresql jooq

6
推荐指数
1
解决办法
565
查看次数

如何使用jOOQ在PostGIS中选择面内的点?

我有一张桌子sensor_location

CREATE TABLE public.sensor_location (
  sensor_id INTEGER NOT NULL,
  location_time TIMESTAMP WITHOUT TIME ZONE NOT NULL,
  location_point public.geometry NOT NULL,
  CONSTRAINT sensor_location_sensor_id_fkey FOREIGN KEY (sensor_id)
    REFERENCES public.sensor(id)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
    NOT DEFERRABLE
) 
Run Code Online (Sandbox Code Playgroud)

我想要一个查询,该查询将返回sensor_ids的传感器和location_times在选定多边形内。

查询应类似于:

SELECT 
  sensor_id,
  location_time,
FROM 
  public.sensor_location
WHERE
  ST_Within(location_point, ST_Polygon(ST_GeomFromText('LINESTRING(-71.050316 48.422044,-71.070316 48.422044,-71.070316 48.462044,-71.050316 48.462044,-71.050316 48.422044)'), 0));
Run Code Online (Sandbox Code Playgroud)

如何使用jOOQ做到这一点?jOOQ甚至可以与PostGIS一起使用吗?我是否必须编写自己的SQL查询并仅使用jOOQ执行它?

我找到了,但是我不知道如何使用它。我仍然是Java新手。

java sql postgresql postgis jooq

6
推荐指数
1
解决办法
1165
查看次数

调试"jOOQ代码生成工具的错误配置"

我正在尝试跟随jOOQ教程.我在第3步(代码生成),但想使用Maven进行代码生成步骤.

这是我的内容pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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>net.hiew</groupId>
    <artifactId>jooq-tutorial</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.jooq</groupId>
            <artifactId>jooq</artifactId>
            <version>3.11.2</version>
        </dependency>
        <dependency>
            <groupId>org.jooq</groupId>
            <artifactId>jooq-meta</artifactId>
            <version>3.11.2</version>
        </dependency>
        <dependency>
            <groupId>org.jooq</groupId>
            <artifactId>jooq-codegen</artifactId>
            <version>3.11.2</version>
        </dependency>
        <dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
            <version>1.1.7</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <!-- Specify the maven code generator plugin -->
                <!-- Use org.jooq            for the Open Source Edition
                         org.jooq.pro        for commercial editions,
                         org.jooq.pro-java-6 for commercial editions with Java 6 support,
                         org.jooq.trial      for the free trial edition

                     Note: Only the …
Run Code Online (Sandbox Code Playgroud)

code-generation maven jooq

6
推荐指数
1
解决办法
1373
查看次数

具有度N元组的jOOQ“ IN”谓词

我需要一个WHERE子句来检查元组IN列表:(field1, field2) in (('1', 1), ('2', 2), ('3', 3))。这在Postgres中是有效的SQL。

方言: POSTGRES

jOOQ版本: 3.9.6

这种情况下正确的jOOQ语法是什么?

jOOQ 3.9文档暗示这是可能的,但是他们的示例仅给出了等级1:https ://www.jooq.org/doc/3.9/manual/sql-building/conditional-expressions/in-predicate-degree-n/

这段代码近似于我要查找的内容,但是我无法获取正确的类型/数据,referenceOrderIdLineNumbers也无法获取jOOQ生成的正确SQL。

Collection<Row2<String, Integer>> referenceOrderIdLineNumbers = ...
List<Object[]> rows = dsl.select(... , field("count(TABLE3)", Integer.class )
  .from(Tables.TABLE1)
  .join(Tables.TABLE2).on(Tables.TABLE2.PK1.eq(Tables.TABLE1.PK1))
  .join(Tables.TABLE3).on(Tables.TABLE3.PK2.eq(Tables.TABLE2.PK2))
  .where(
    row(Tables.TABLE1.FIELD1, Tables.TABLE2.FIELD2) // <-- what to 
    .in(referenceOrderIdLineNumbers)                // <-- do here??
  )
  .groupBy(...)
  .fetch();
Run Code Online (Sandbox Code Playgroud)

java sql postgresql jooq

6
推荐指数
1
解决办法
149
查看次数

如何在 jOOQ 查询中使用 Postgres 的 to_char?

我正在尝试将以下 PostgreSQL 查询转换为 jOOQ:

SELECT count(*), to_char(created_date, 'YYYY-MM-DD') as year_month_date
  FROM log
  GROUP BY year_month_date
  ORDER BY year_month_date
Run Code Online (Sandbox Code Playgroud)

我所拥有的是:

jooq.select(
    DSL.count(),
    DSL.field("to_char(created_date, 'YYYY-MM-DD') as year_month_date")
  )
  .from(LOG)
  .groupBy(DSL.field("year_month_date"))
  .orderBy(DSL.field("year_month_date"))
  .fetch();
Run Code Online (Sandbox Code Playgroud)

有没有办法使用 jOOQ 的 fluent API 以便我不必使用字符串?

java sql jooq

6
推荐指数
1
解决办法
292
查看次数