有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java表整形

我正在使用设计非常糟糕的数据库,在编写查询之前,我需要重新塑造表的形状

以下是我常见的问题:

  • 时间戳分为两列(一列表示日期,另一列表示时间)
  • 一些字符串列也被拆分为多个列
  • 大多数弦都有固定长度&;空白填充,所以我需要修剪它们

我首先考虑调整Jooq生成器的输出。但是看一下createField(...)方法,它将字段附加到fields0()上,后者是包私有的。这使得SELECT *查询所有(且仅)“原始”字段,而不是重新成形的字段

静态(即类/成员)或动态(即代码)声明此类模型的最佳方式是什么


共 (2) 个答案

  1. # 1 楼答案

    我最终使用以下类获得结果(为了简化,我忽略了模式处理、绑定和转换)

    但是,它依赖于在jOOQ包中注入自定义类&;重用内部代码。这可能会导致安全性(如果密封罐/包)和可维护性问题。这就是为什么我不认为它是有效的,但可能的回答问题EME><

    jOOQ hack:

    package org.jooq.impl
    public abstract class Projection<R extends Record> extends TableImpl<R> {
    
      public static final <R extends Record, T> TableField<R, T> newField(String name, DataType<T> type, Table<R> table) {
        return newField(name, type, table, null, null, null);
      }
      public static final <R extends Record, T, X, U> TableField<R, U> newField(String name, DataType<T> type, Table<R> table, String comment, Converter<X, U> converter, Binding<T, X> binding) {
        final Binding<T, U> actualBinding = DefaultBinding.newBinding(converter, type, binding);
        @SuppressWarnings("unchecked")
        final DataType<U> actualType =
            converter == null && binding == null
          ? (DataType<U>) type
          : type.asConvertedDataType(actualBinding);
    
        final TableFieldImpl<R, U> tableField = new TableFieldImpl<R, U>(name, actualType, table, comment, actualBinding);
    
       return tableField;
      }
    
      protected Projection(String name) {
        this(name, null);
      }
      protected Projection(String name, Table<R> aliased) {
        super(name, null, aliased);
      }
    
      protected <T> TableField<R,T> field(String name, DataType<T> type) {
        return newField(name, type, this);
      }
      protected <T,F extends Field<T>> F add(F field) {
        fields0().add(field);
        return field;
      }
      protected Fields<R> getFields() {
        return fields0();
      }
    }
    

    我对常见问题的抽象:

    package com.company.model.jooq;
    public abstract class MyProjection<R extends Record> extends Projection<R> {
      /**
       * Unique version identifier for serialization.
       */
      private static final long serialVersionUID = 1L;
    
      protected Field<String> trimmed(String name) {
        return DSL.trim(newField(name, SQLDataType.VARCHAR, this)).as(name);
      }
      protected Field<String> joined(String name, String... names) {
        @SuppressWarnings("unchecked")
        Field<String>[] fields = new Field[names.length];
        for (int i = 0; i < names.length; i++) {
          fields[i] = newField(names[i], SQLDataType.VARCHAR, this);
        }
        return DSL.trim(DSL.concat(fields)).as(name);
      }
      protected Field<Timestamp> timestamp(String suffix) {
        return DSL.function("timestamp", SQLDataType.TIMESTAMP,
            newField("DT_" + suffix, SQLDataType.DATE, this),
            newField("TI_" + suffix, SQLDataType.TIME, this)
        ).as("TS_" + suffix);
      }
    
      protected MyProjection(String name) {
        super(name);
      }
      protected MyProjection(String name, Table<R> aliased) {
        super(name, aliased);
      }
    }
    

    表模型示例:

    package com.company.model.jooq;
    public class MyProjectedTable extends MyProjection<Record> {
      public final TableField<Record, Integer> ID        = add(field("ID", SQLDataType.INTEGER));
      public final Field<Timestamp>            TS_CREATE = add(timestamp("CREATE"));
      public final Field<Timestamp>            TS_UPDATE = add(timestamp("UPDATE"));
      public final TableField<Record, String>  NAME      = add(field("NAME", SQLDataType.VARCHAR));
      public final Field<String>               LABEL     = add(trimmed("LABEL"));
      public final Field<String>               COMMENT   = add(joined("COMMENT", "COMMENT1", "COMMENT2", "COMMENT3"));
    }