我正在使用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.
如果这是不可能的,这里的常见做法是什么?我是否应该查询数据库中每个可能的约束违规?这闻起来像一个维护陷阱.
我想知道JDK9模块.假设您有以下3个包:
com.company.product
com.company.product.impl_a
com.company.product.impl_b
Run Code Online (Sandbox Code Playgroud)
在包中的类product.impl_a和product.impl_b只能通过在包中的类访问product.用户应该只使用product包中的类.你可以想像,传递的某些标志或属性将决定是否impl_a或impl_b将被使用,在内部.
在JDK8-中,您必须在内部impl_a和中创建这些类impl_b public.这有点糟糕,因为可以欺骗用户他们可以使用这些类.它完全有效并且允许.
JDK9如何在这里提供帮助?我们是否会声明一个模块product.impl_a和另一个模块,并product.impl_b声明导出的类只能由第三个模块访问product,这取决于两个模块product.impl_a和product.impl_b?另外,实际上不可能申报一个新的模块,它依赖于product.impl_a或product.impl_b?其他模块只能依赖于模块product吗?
我有一个领域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)