sql >> Databáze >  >> RDS >> PostgreSQL

Výčty Java, JPA a Výčty Postgres – Jak zajistím, aby spolupracovaly?

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ď:

  1. 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:

  1. 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.



  1. Soulad s PCI pro MySQL a MariaDB s ClusterControl

  2. Řešení chyb Oracle

  3. 4 Funkce pro formátování čísla na 2 desetinná místa v SQL Server

  4. Příklady QUARTER() – MySQL