小编Kev*_*ote的帖子

jOOQ:DataAccessException和约束

我正在使用Jersey和jOOQ实现REST API.

我有一个带有一些约束的表,例如一个唯一的键.当插入违反此约束的元组时,jOOQ会抛出DataAccessException:

org.jooq.exception.DataAccessException: SQL [insert into ...]; ERROR: duplicate key value violates unique constraint "issue_name_key"
Run Code Online (Sandbox Code Playgroud)

有没有办法找出违反了哪个约束,没有字符串解析错误消息?如果违反了约束,我想返回一个400 bad requesthttp状态代码而不是一个500 general error.

如果这是不可能的,这里的常见做法是什么?我是否应该查询数据库中每个可能的约束违规?这闻起来像一个维护陷阱.

java http unique-constraint jooq http-status-code-400

5
推荐指数
1
解决办法
1290
查看次数

JDK9模块如何帮助"封装范围的子包"?

我想知道JDK9模块.假设您有以下3个包:

com.company.product
com.company.product.impl_a
com.company.product.impl_b
Run Code Online (Sandbox Code Playgroud)

在包中的类product.impl_aproduct.impl_b只能通过在包中的类访问product.用户应该只使用product包中的类.你可以想像,传递的某些标志或属性将决定是否impl_aimpl_b将被使用,在内部.

在JDK8-中,您必须在内部impl_a和中创建这些类impl_b public.这有点糟糕,因为可以欺骗用户他们可以使用这些类.它完全有效并且允许.

JDK9如何在这里提供帮助?我们是否会声明一个模块product.impl_a和另一个模块,并product.impl_b声明导出的类只能由第三个模块访问product,这取决于两个模块product.impl_aproduct.impl_b?另外,实际上不可能申报一个新的模块,它依赖于product.impl_aproduct.impl_b?其他模块只能依赖于模块product吗?

java java-9

5
推荐指数
1
解决办法
313
查看次数

jOOQ - 为字段创造价值

我有一个领域Field<T>.我想为该字段创建一个命名值,以便能够在查询中使用它.值的名称应该是字段的名称.

select value as field from ...
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?

public <T> Field<T> namedValue(Field<T> field, T value) {
    return DSL.val(value, field).as(field);
}
Run Code Online (Sandbox Code Playgroud)

虽然它有效,但我想知道是否有更短的方法来做到这一点.我可能在这里迂腐:).

更新

我正在创建以下构造:

UPADTE table SET x = alias.x, y = alias.y
FROM (SELECT constant value for x, table2.y FROM table2 WHERE ...) AS alias.
Run Code Online (Sandbox Code Playgroud)

让我们简化一下(为了这个例子,专注于常量选择):

SELECT
FROM (SELECT constant value for x) AS alias.
Run Code Online (Sandbox Code Playgroud)

首先,我开始:

Select s1 = context.select(DSL.val("TEST"));
Select s2 = context.select(s1.fields()).from(s1);
Run Code Online (Sandbox Code Playgroud)

这导致查询不正确:

select "alias_66794930"."TEST" from (select 'TEST') as "alias_66794930"
Run Code Online (Sandbox Code Playgroud)

(我不确定这是否是jOOQ的正确行为.)

所以,我添加了一个别名:

Select s1 = context.select(DSL.val("TEST").as(X)); …
Run Code Online (Sandbox Code Playgroud)

sql api alias jooq

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

标签 统计

java ×2

jooq ×2

alias ×1

api ×1

http ×1

http-status-code-400 ×1

java-9 ×1

sql ×1

unique-constraint ×1