回答

收藏

如何在Jooq中处理日期?

技术问答 技术问答 344 人阅读 | 0 人回复 | 2023-09-13

当我们使用普通的JDBC连接时,我们使用下面的代码格式化日期或转换日期8 g2 Q, _2 J- s9 D1 B: Y
if(argDB.equals("Oracle")){2 n: P1 K1 J) k) T5 d5 j8 e
       sb.append(" AND TO_CHAR(PaymentDate, 'YYYY-MM-DD') 现在我们正在使用JOOQ吗?您认为我们是否必须像以前一样转换日期,或者JOOQ可以在内部处理这种类型的问题??由于我现在检查JOOQ不支持TO_CHAROracle和卢卡斯的方法给出了这个有些另类这里4 M: Y2 f7 q& i! A) u7 D+ m4 L
                + b' R, ~' |2 Q. D/ w
解决方案:
9 S: Y) R  j( G               
! u& H0 `* P3 W  _0 C. ~2 W5 j1 y. u, G- E% ?7 N

% `+ ^3 J! d; i, G& Y/ p! B% S                编写谓词的更好方法. a0 M/ v2 Q. Y; q8 F1 ]) T
由于您仅格式化日期以比较日期,因此您可能应该只比较日期值本身,因为数据库将能够使用索引,所以这将更快得多:
& I! B. J. Y- t-- In SQL  I: [' h2 V4 ^
ACCOUNT_PAYMENT.PAYMENT_DATE 实现与方言无关的自定义TO_CHAR()功能。
, W) t/ o9 D8 ]: ]% p$ X/ h5 FCustomField为此,您应该创建一个。这将允许您与jOOQ的查询呈现和变量绑定生命周期进行交互,以便根据RenderContext的基础呈现SQL方言特定的子句SQLDialect。从本质上讲,这可以归结为编写(假设使用jOOQ
5 ~! D- ~" s1 L/ F7 c6 Q: C3.2 API):
8 d! Z9 F9 }' A; ^, q1 qclass ToChar extends CustomField {
2 `8 o* g* {) f; i3 l) a2 G  O7 }' z    final Field arg0;
; k- V& A1 N+ X    final Field arg1;( t/ O& _- Y% m/ j8 d8 U. v8 Q  _
    ToChar(Field arg0, Field arg1) {- C" O( o1 ~2 k/ H
        super("to_char", SQLDataType.VARCHAR);
  [* C4 p5 [9 M6 d- j        this.arg0 = arg0;7 c. C- ?6 t0 z, ~" n
        this.arg1 = arg1;
* h/ B4 `- F/ A3 j, E. l. |+ ^" E    }
0 X* D2 P' ]  n" O; q- D3 Y9 |    @Override
* d8 S! s+ N# s& z& h* T    public void toSQL(RenderContext context) {6 O. y  c: K, A7 m# z' p
        context.visit(delegate(context.configuration()));
: X$ e6 C0 ~9 Q, K4 x" _3 g    }! c% R# j( {, M' T
    @Override
$ Q! n1 @4 d8 N+ _* Z/ Z3 W) b    public void bind(BindContext context) {
& a3 _  b  g. \/ Z* P        context.visit(delegate(context.configuration()));* I+ Q/ d- h; z% o
    }
" H. b$ A$ |& j* s0 d( I, r1 [! B) |    private QueryPart delegate(Configuration configuration) {
- d1 ^. y, `6 ?) u+ T7 L0 j        switch (configuration.dialect().family()) {6 k* g) C! h- ?7 l  H( H$ s3 s
            case ORACLE:' E5 R, K$ t+ ^# B# H( E
                return DSL.field("TO_CHAR({0}, {1})",
8 D$ a8 M, u3 b, L; r                    String.class, arg0, arg1);- y" o7 e3 ]5 q9 R3 I# C- H
            case SQLSERVER:
5 }5 I& v( ~* T% I7 L                return DSL.field("CONVERT(VARCHAR(8), {0}, {1})", " J' r. E3 o9 Y" i8 g
                    String.class, arg0, arg1);$ e) ]1 W1 E6 {4 X: g( T# M9 K4 [$ n
            default:
2 g% k4 Q) B1 c& p4 s4 C" Z                throw new UnsupportedOperationException("Dialect not supported");+ v) s( m! L$ Y
        }# }+ l3 Q( N( t. ?0 o
    }
) W/ U0 E5 B9 X( X( g  u* O}
& m! k2 h  W, ?8 `然后,您可以编写自己的静态实用程序方法,如下所示:! B5 i) a' F; B, v7 R
public class MyDSL {
  A1 |- ~9 Q& S, y! j7 J& \+ C    public static Field toChar(Field field, String format) {* K7 X/ F) _$ ]' o6 J
        return new ToChar(field, DSL.inline(format));+ w% m8 \& E4 a* [( s, x9 m/ P/ Y
    }- Z% c% n" d# F: p# ?; m/ V+ y/ b
}
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则