我想知道如何利用最新版本的 PostgresSQL 中可以找到的新范围类型。
我可以找到有关如何使用自定义 Java 类型管理普通列的jOOQ文档,但是我找不到如何在自定义 Java 类型中使用自定义类型列。jOOQ 中是否有文档或一段现有代码可供我查看并尝试贡献?
I learning how to work with jooq. I would like to know if I can add some domain-level methods in to the generated Record classes.
Suppose the record was this:
public class ConCalCompanyRecord extends org.jooq.impl.UpdatableRecordImpl<com.aesthete.csmart.connect.model.db.gen.tables.records.ConCalCompanyRecord> implements org.jooq.Record6<java.lang.Integer, java.lang.Integer, java.lang.String, java.lang.String, java.sql.Timestamp, java.sql.Timestamp> {
// properties
// getters and setters
// I would like to add a method like this:
public void isABlueCompany(){
// work with the fields
}
}
Run Code Online (Sandbox Code Playgroud)
But I know if I do this, as soon as I …
我在 jOOQ 中表达以下查询时遇到问题
SELECT s.season_name, l.league_name,
COUNT(CASE WHEN m.full_time_result = 'H' THEN 'H' END) AS home_wins,
COUNT(CASE WHEN m.full_time_result = 'D' THEN 'D' END) AS draws,
COUNT(CASE WHEN m.full_time_result = 'A' THEN 'A' END) AS away_wins,
COUNT(m.full_time_result) AS all_matches
FROM football_stats.matches AS m
JOIN football_stats.seasons AS s USING (season_id)
JOIN football_stats.leagues AS l USING (league_id) GROUP BY s.season_name, l.league_name
Run Code Online (Sandbox Code Playgroud)
我的java代码是:
final Field<String> homeWins = DSL.decode().when(MATCHES.FULL_TIME_RESULT.eq(HOME_WIN), HOME_WIN).as("home_wins");
final Field<String> draws = DSL.decode().when(MATCHES.FULL_TIME_RESULT.eq(DRAW), DRAW).as("draws");
final Field<String> awayWins = DSL.decode().when(MATCHES.FULL_TIME_RESULT.eq(AWAY_WIN), AWAY_WIN).as("away_wins");
final Field<?>[] …Run Code Online (Sandbox Code Playgroud) 是否可以在没有数据库连接的情况下使用 JOOQ 从 sql 文件生成 Java 类?我尝试指定 inputSchema 标记,但出现异常:
WARNING: SQL exception : Exception while executing meta query: Cannot execute query. No Connection configured
Run Code Online (Sandbox Code Playgroud)
我的配置如下:
<configuration>
<generator>
<database>
<name>org.jooq.util.postgres.PostgresDatabase</name>
<inputSchema>filesystem:src/main/resources/schema.sql</inputSchema>
<includes>.*</includes>
<outputSchemaToDefault>true</outputSchemaToDefault>
</database>
<target>
<packageName>pckg.some</packageName>
<directory>target/generated-sources/jooq</directory>
</target>
</generator>
</configuration>
Run Code Online (Sandbox Code Playgroud) 我想使用POJO作为源更新JOOQ记录中的已更改字段.Record.from(Object)几乎是正确的,但根据文件
生成的记录将为所有值将其内部"已更改"标志设置为true.
我只希望实际更改的字段(如说,确定Objects.equals(Object, Object))更新其标志.
这样做的两个原因是:
我正在寻找从用户定义的函数进行查询。select我见过的所有示例都是以参数形式查询函数
myFunction.setMyParam("plapla");
create.select(myFunction.asField()).fetch();
Run Code Online (Sandbox Code Playgroud)
尽管结果实际上是多列,但这会将结果作为一列返回。
我想做的是
myFunction.setMyParam("plapla");
create.select().from(myFunction).fetch();
Run Code Online (Sandbox Code Playgroud)
但我还没有找到办法这样做......
目前我正在使用
DSL.using(create.configuration())
.select()
.from("myFunction('" + myparam + "')")
.fetch();
Run Code Online (Sandbox Code Playgroud)
这似乎不是一个好的解决方案(未转义、未经处理等)
如何使用JOOQ生成的函数来做到这一点?
我使用 jOOQ 和普通 SQL(不是生成的代码)。我正在尝试直接选择具有一些枚举类型字段的 POJO。
MyType pojo = context.select().from(table("Table"))
.where(field("ID").equal("1")).fetchOne()
.into(MyType.class);
Run Code Online (Sandbox Code Playgroud)
在我看来,我只能为整个 POJO 指定一个高级映射器,如下所示:
MyType pojo = context.select().from(table("Table"))
.where(field("ID").equal("1")).fetchOne()
.map(new RecordMapper<Record, MyType>() {
@Override
public MyType map(Record record) {
...
}
});
Run Code Online (Sandbox Code Playgroud)
我找不到只为某些字段提供映射或转换器的方法。具体来说,我想告诉 jooq 类似“正常转换所有字段,除非我的 POJO 中的字段是 MyEnum 类型,在这种情况下使用此映射(或转换器)”。
如何为某些字段指定映射器而不为其他字段指定映射器?
顺便说一句,我注意到我可以在配置级别做类似的事情,将数据库字段名称与通配符匹配(如此处所述),但我认为如果由 POJO 中字段的类型来驱动决策会更好。
我正在尝试在我的 Micronaut 应用程序中使用 jOOQ,并将 jOOQ DSLContext 作为注入的 bean 自动提供给我的构造函数,但它找不到 bean。
我已经在 application.yml 中配置了数据源以连接到我的 postgres 数据库,并声明了我的构造函数如下:
@Singleton
public class RepositoryImpl implements Repository
{
private final DSLContext context;
public RepositoryImpl(DSLContext context)
{
this.context = context;
}
}
Run Code Online (Sandbox Code Playgroud)
和我的 application.yml 为:
datasources:
default:
url: "jdbc:postgresql://localhost:5432/my_db"
username: "user"
password: "password"
driver-class-name: "org.postgresql.Driver"
Run Code Online (Sandbox Code Playgroud)
我在 build.gradle 中包含了以下依赖项
compile 'io.micronaut.configuration:micronaut-jooq'
runtime 'org.postgresql:postgresql:42.2.4'
Run Code Online (Sandbox Code Playgroud)
我希望我可以访问 DSLContext 并在我的 RepositoryImpl 类中编写查询,但是在尝试使用实现类时,代码失败并出现以下异常:
Caused by: io.micronaut.context.exceptions.NoSuchBeanException: No bean of type [org.jooq.DSLContext] exists. Make sure the bean is not disabled by bean requirements (enable …Run Code Online (Sandbox Code Playgroud) 我有以下查询,我连接表A,B以及C:
C与B通过有关C.B_IDB与A通过有关B.A_ID我想检索一份报告,其中对于每个C,我还想从相应的B和 中检索字段A。如果只需要字段的子集,则投影和提取到 POJO(具有来自C, B, 的必需属性A)是一种显而易见的方法。
class CReportDTO {
Long c_id;
Long c_field1;
Long c_bid;
Long b_field1;
// ...
CReportDTO(Long c_id, Long c_field1, Long c_bid, Long b_field1) {
// ...
}
// ..
}
Run Code Online (Sandbox Code Playgroud)
public List<CReportDTO> getPendingScheduledDeployments() {
return dslContext.select(
C.ID,
C.FIELD1,
C.B_ID,
B.FIELD1,
B.A_ID
A.FIELD1,
A.FIELD2
)
.from(C)
.join(B)
.on(C.B_ID.eq(B.ID))
.join(A)
.on(B.A_ID.eq(A.ID)) …Run Code Online (Sandbox Code Playgroud) 我在 php 上有应用程序后端。但最近我在 Quarkus 上创建了相同的后端,并将其部署在带有数据库 MYSQL 的 kubernetes 上。我在 php 后端路由一半用户,从应用路由一半 qaurkus。PHP 后端工作正常,但 quarkus 后端有问题,它在几个小时后卡住,请求延迟增加超过一分钟,有时会超时。在检查了一些堆栈之后,我发现它卡在数据源中的 getConnection 上,我正在起诉 agroal。它不是数据库问题,因为与此同时,如果我使用 php 检查应用程序,它运行良好,没有任何问题或延迟。我也尝试增加和减少最小/最大池大小,但仍然是同样的问题。我将分享我在 mysql 中使用 quarkus、agroal 和 jooq 的结构。我认为问题在于那个。
我正在使用 kotlin 并且 DSLContext 是静态的对象。
应用程序.kt
@ApplicationScoped
class AppLifecycleBean {
@Inject
lateinit var dsl: DSLContext
@Inject
lateinit var launchMode: LaunchMode
fun onStart(@Observes ev: StartupEvent?) {
DBHelper.init(dsl)
}
fun onStop(@Observes ev: ShutdownEvent?) {
}
}
Run Code Online (Sandbox Code Playgroud)
数据库助手.kt
object DBHelper {
lateinit var db: DSLContext
private set
fun init(db: DSLContext){
this.db = db
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我在应用程序开始时将 JOOQ …