我有一些看起来像这样的代码:
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的全部意义).有什么建议?
我是新与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,否则将无法编译
我试过写一个Converter<java.sql.Date, java.time.LocalDate>但我不能让它与所有时区设置一起工作.
想法:
LocalDate,例如2014年8月20日,并将其保存到数据库,则无论客户端时区是什么,它都应该在数据库中显示为2014年8月20日.我的测试:
@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) 我有以下选择查询创建:
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) 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的解决方案?
我正在尝试使用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)
有任何想法吗?
谢谢,美好的一天
我有一张桌子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新手。
我正在尝试跟随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) 我需要一个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) 我正在尝试将以下 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 以便我不必使用字符串?