Перечисления QueryDSL и PostgreSQL?

Мы используем QueryDSL с базой данных PostgreSQL и сначала создаем базу данных нашего домена. Наши доменные компоненты Java автоматически генерируются с использованием подключаемого модуля QueryDSL Maven версии 3.6.1.

Прежде всего, можно ли настроить плагин QueryDSL для автоматического создания перечислений Java из перечислений баз данных PostgreSQL? Например:

Когда у нас есть перечисление:

CREATE TYPE customertype AS ENUM ('person','company');

Что используется как тип столбца:

CREATE TABLE customer (customertype customertype,...

Я хотел бы, чтобы класс Java создавался как:

public class Customer {

private CustomerType customerType;

... и указанное перечисление как:

public enum CustomerType {
    PERSON,
    COMPANY,
}

Судя по тому, что я узнал после долгих поисков, это может быть невозможно с текущей функциональностью плагина?

В этом случае, очевидно, можно было бы определить перечисление Java вручную, а затем вручную привязать к нему столбец customertype таблиц клиентов, используя определение сопоставления типов подключаемых модулей. Вопрос в том, как это сделать? Я бы предположил, что мне придется создать класс конвертера

public class StringToCustomerType extends EnumAsObjectType<CustomerType>

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

<typeMapping>
   <table>customer</table>
   <column>customertype</column>
   <type>com.example.StringToCustomerType</type>
</typeMapping>

Или есть лучший способ добиться желаемой ситуации?

Очевидно, грубый способ обойти проблему - определить stringtype = unspecified в строке подключения JDBC, определить столбец, который будет отображаться как строку, и напрямую использовать строковые значения перечислений, как при размещении значений в объекты домена. Однако это не кажется надежным решением.

Будем признательны за все предложения и советы! Спасибо!


person Mikko Rönkkömäki    schedule 20.03.2015    source источник
comment
Я совсем не знаком с QueryDSL, но драйвер Postgres Hibernate будет работать прозрачно, если вы обработаете поле перечисления как JPA @Enumerated(STRING) и назовете перечисления так же, как значения базы данных. Сработает ли указание QueryDSL рассматривать перечисление как строку?   -  person chrylis -cautiouslyoptimistic-    schedule 20.03.2015


Ответы (1)


Ваш StringToCustomerType подход выглядит разумным. Он должен обеспечить отображение перечисления, как и ожидалось.

person Timo Westkämper    schedule 20.03.2015