Ve skutečnosti jsem používal jednodušší způsob než ten s PGObject a Converters. Vzhledem k tomu, že v Postgresu jsou výčty převedeny zcela přirozeně na text, stačí jej nechat dělat to, co umí nejlépe. Vypůjčím si Arjanův příklad nálad, pokud mu to nebude vadit:
Typ výčtu v Postgres:
CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
Třída a výčet v Javě:
public @Entity class Person {
public static enum Mood {sad, ok, happy};
@Enumerated(EnumType.STRING)
Mood mood;
}
Tato značka @Enumerated říká, že serializace/deserializace výčtu by měla být provedena v textu. Bez něj používá int, což je více problematické než cokoli jiného.
V tuto chvíli máte dvě možnosti. Vy buď:
-
Přidejte stringtype=unspecified k připojovacímu řetězci, jak je vysvětleno v parametrech připojení JDBC. To Postgresu umožňuje odhadnout typ na pravé straně a vše adekvátně převést, protože obdrží něco jako 'enum =neznámý', což je výraz, se kterým již ví, co má dělat (zdroj hodnota ? pro deserializátor typu na levé straně). Toto je preferovaná možnost, jak by to mělo fungovat pro všechny jednoduché UDT, jako jsou výčty najednou.
jdbc:postgresql://localhost:5432/dbname?stringtype=unspecified
Nebo:
-
Vytvořte implicitní převod z varchar na enum v databázi. Takže v tomto druhém případě databáze obdrží nějaké přiřazení nebo srovnání jako 'enum =varchar' a ve svém interním katalogu najde pravidlo, které říká, že může předat hodnotu z pravé ruky přes serializační funkci varchar následovanou deserializační funkcí enum. To je více kroků, než by mělo být zapotřebí; a příliš mnoho implicitních přetypování v katalogu může způsobit, že libovolné dotazy budou mít nejednoznačnou interpretaci, proto je používejte střídmě. Tvorba obsazení je:
VYTVOŘTE OBSAH (POSTAVA SE MĚNÍ podle nálady) S INOUT JAKO IMPLICITNÍ;
S tím by měl fungovat.