Как получить тип SQL из типа Java для любого магазина, использующего hibernate + spring + java? - PullRequest
1 голос
/ 04 апреля 2019

Я пытаюсь предсказать тип sql из типа java для любого магазина.Я знаю, что spring + hibernate внутренне делает это, используя dialect для выполнения таких операций, как auto-ddl и для создания сценариев.Как я могу сделать это в Java?

Когда я говорю тип Java, я имею в виду тип данных атрибута моего jpa объекта.

Я не хочу делать ручное отображениеВместо этого я хочу, чтобы магазины, соответствующие dialect, делали это для меня во время выполнения. Есть ли способ сделать это?

Есть ли способ сделать это?

Поскольку hibernate делает это с помощью диалекта, я должен кое-что использовать.

1 Ответ

0 голосов
/ 08 апреля 2019

Я исследовал, как Hibernate делал это, используя dialect, и придумал код.

Сначала я сопоставил java type с sql type integer value

    MAPPING = new HashMap<String, Integer>();

    MAPPING.put("short", Types.SMALLINT);

    MAPPING.put("java.lang.Short", Types.SMALLINT);

    MAPPING.put("int", Types.INTEGER);

    MAPPING.put("java.lang.Integer", Types.INTEGER);

    MAPPING.put("float", Types.FLOAT);

    MAPPING.put("java.lang.Float", Types.FLOAT);

    MAPPING.put("long", Types.BIGINT);

    MAPPING.put("java.lang.Long", Types.BIGINT);

    MAPPING.put("BigInteger", Types.BIGINT);

    MAPPING.put("double", Types.DECIMAL);

    MAPPING.put("java.lang.Double", Types.DECIMAL);

    MAPPING.put("java.math.BigDecimal", Types.DECIMAL);

    MAPPING.put("BigDecimal", Types.DECIMAL);

    MAPPING.put("Integer", Types.DECIMAL);

    MAPPING.put("Decimal", Types.DECIMAL);

    MAPPING.put("boolean", Types.SMALLINT);

    MAPPING.put("java.lang.Boolean", Types.SMALLINT);

    MAPPING.put("Date", Types.TIMESTAMP);

    MAPPING.put("char", Types.VARCHAR);

    MAPPING.put("java.lang.Character", Types.VARCHAR);

    MAPPING.put("byte", Types.CHAR);

    MAPPING.put("java.lang.Byte", Types.CHAR);

    MAPPING.put("java.lang.String", Types.VARCHAR);

    MAPPING.put("String", Types.VARCHAR);

    MAPPING.put("java.lang.Object", Types.JAVA_OBJECT);

Тогда я использовал отображение

       //the type value varies with the dialect of the store 

        registerColumnType(-7, "bit");
        registerColumnType(16, "boolean");
        registerColumnType(-6, "tinyint");
        registerColumnType(5, "smallint");
        registerColumnType(4, "integer");
        registerColumnType(-5, "bigint");
        registerColumnType(6, "float($p)");
        registerColumnType(8, "double precision");
        registerColumnType(2, "numeric($p,$s)");
        registerColumnType(7, "real");

        registerColumnType(91, "date");
        registerColumnType(92, "time");
        registerColumnType(93, "timestamp");

        registerColumnType(-3, "bit varying($l)");
        registerColumnType(-4, "bit varying($l)");
        registerColumnType(2004, "blob");

        registerColumnType(1, "char($l)");
        registerColumnType(12, "varchar($l)");
        registerColumnType(-1, "varchar($l)");
        registerColumnType(2005, "clob");

        registerColumnType(-15, "nchar($l)");
        registerColumnType(-9, "nvarchar($l)");
        registerColumnType(-16, "nvarchar($l)");
        registerColumnType(2011, "nclob");


        registerColumnType(-7, "SMALLINT");
        registerColumnType(-6, "SMALLINT");
        registerColumnType(-5, "NUMERIC(21,0)");
        registerColumnType(5, "SMALLINT");
        registerColumnType(1, "CHARACTER(1)");
        registerColumnType(8, "DOUBLE PRECISION");
        registerColumnType(6, "FLOAT");
        registerColumnType(7, "REAL");
        registerColumnType(4, "INTEGER");
        registerColumnType(2, "NUMERIC(21,$l)");
        registerColumnType(3, "NUMERIC(21,$l)");
        registerColumnType(91, "DATE");
        registerColumnType(92, "TIME");
        registerColumnType(93, "TIMESTAMP");
        registerColumnType(12, "CHARACTER($l)");
        registerColumnType(2004, "BLOB($l)");

И код поиска был такой

public String toSQLType(String java_type){
String type=columnTypes.get(JAVA_DATABASE_MAPPING.get(java_type));
return type;
}
...