Может ли спящий режим отображать EnumTypes с пробелами? - PullRequest
4 голосов
/ 26 мая 2009

Имея отображение hibernate для устаревшей базы данных, я хочу использовать EnumTypes для отображения определенных столбцов, которые содержат строковые константы с пробелами, в некоторый класс Enum.

Отображение:

@Entity
@Table(name = "OPERATOR")
public class Operator {   
    @Id
    @Column(name = "ID")
    private Long id;
    ...

    @Enumerated(EnumType.STRING)
    @Column(name = "STATUS")
    private Status status;
    ...
}

public enum Status {
    OPERATOR_CREATED("Operator created"),
    ACTIVE("Active"),
    END_DATED("End dated");

    private String name;

    Status(String status) {
       name = status;
    }
}

Как видите, мы не можем использовать значения базы данных в качестве имен перечислений, поскольку в них есть пробелы.

Мне было интересно, можно ли использовать для этого перечисления?

Ответы [ 2 ]

4 голосов
/ 26 мая 2009

Посмотрите на GenericEnumUserType, описанное на hibernate.org (в разделе "Гибкое решение")

Изменить Status следующим образом:

public enum Status 
{
    OPERATOR_CREATED("Operator created"),
    ACTIVE("Active"),
    END_DATED("End dated");

    private String name;

    Status(String status) 
    {
       name = status;
    }

    public String toString()
    {
       return name;
    }

    public Status fromString( String value )
    {
        if ( "Operator created".equals( value ) 
        {
            return OPERATOR_CREATED;
        }
        //etc
    }
}

Теперь используйте аннотацию @Type для вашей сущности.

@Entity
@Table(name = "OPERATOR")
public class Operator {   
    @Id
    @Column(name = "ID")
    private Long id;
    ...

    @Column(name = "STATUS", columnDefinition = "VARCHAR(31)", nullable = false )
    @Type( type = "my.package.GenericEnumUserType",
           parameters = {
        @Parameter( name = "enumClass", value =  "my.package.Status" ),
        @Parameter( name = "identifierMethod", value = "toString" ),
        @Parameter( name = "valueOfMethod", value = "fromString" ) } )
    private Status status;
    ...
}
0 голосов
/ 28 декабря 2018

У меня была точно такая же ситуация, попробуйте использовать функцию replace, что-то вроде этого:

@ColumnTransformer(read = "replace(status::varchar, ' ', '')", write = "replace(?, 'End', 'End ')::status")

У вас есть подчеркивание, поэтому нужно немного его изменить.

regexp_replace также может быть удобно, если есть несколько значений enum с пробелами.

Обратите внимание, я использую postgresql 9.6

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...