sql >> Databasteknik >  >> RDS >> PostgreSQL

Java Enums, JPA och Postgres enums - Hur får jag dem att fungera tillsammans?

Jag har faktiskt använt ett enklare sätt än det med PGObject och Converters. Eftersom enums i Postgres konverteras ganska naturligt till-från text behöver du bara låta den göra det den gör bäst. Jag lånar Arjans exempel på humör, om han inte har något emot det:

Enum-typen i Postgres:

CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');

Klassen och uppräkningen i Java:

public @Entity class Person {

  public static enum Mood {sad, ok, happy};

  @Enumerated(EnumType.STRING)
  Mood mood;

}

Den @Enumerated-taggen säger att serialisering/deserialisering av enumet ska göras i text. Utan det använder den int, vilket är mer besvärligt än något annat.

Vid det här laget har du två alternativ. Du antingen:

  1. Lägg till stringtype=unspecificed till anslutningssträngen, som förklaras i JDBC-anslutningsparametrar. Detta låter Postgres gissa typen på höger sida och konvertera allt på ett adekvat sätt, eftersom den tar emot något som 'enum =okänt', vilket är ett uttryck som den redan vet vad den ska göra med (flöde ?-värdet till den vänstra typen deserializer). Detta är det föredragna alternativet, eftersom det borde fungera för alla enkla UDT:er som enums på en gång.

    jdbc:postgresql://localhost:5432/dbname?stringtype=unspecified
    

Eller:

  1. Skapa en implicit konvertering från varchar till enum i databasen. Så i det här andra fallet får databasen någon tilldelning eller jämförelse som 'enum =varchar' och den hittar en regel i sin interna katalog som säger att den kan skicka det högra värdet genom serialiseringsfunktionen för varchar följt av deserialiseringsfunktionen för uppräkning. Det är fler steg än vad som borde behövas; och att ha för många implicita casts i katalogen kan orsaka att godtyckliga frågor får tvetydiga tolkningar, så använd det sparsamt. Skådespelaren är:

    SKAPA CAST (KARAKTÄR VARIERAR som humör) MED INUT SOM UNDERFÖRSTÅDET;

Borde fungera med just det.



  1. Relation existerar inte

  2. Använda en sorteringsordningskolumn i en databastabell

  3. MySQL Beställ före Gruppera efter

  4. flera frågor samma tabell men i olika kolumner mysql