sql >> Databasteknik >  >> RDS >> PostgreSQL

Är JPA (EclipseLink) anpassade typer möjliga?

När jag gick igenom SÅ har jag hittat många frågor som denna angående JSON- eller XML-typer för mappning till Postgres. Det verkar som om ingen har ställts inför problemet med att läsa från anpassad Postgres-typ, så här är lösningen för både läsning och skrivning med en ren JPA-typkonverteringsmekanism.

Postgres JDBC-drivrutin mappar alla attribut för okända (till Java) typer till org.postgresql.util.PGobject-objekt, så det räcker med att göra omvandlare för denna typ. Här är entitetsexempel:

@Entity
public class Course extends AbstractEntity {
    @Column(name = "course_mapped", columnDefinition = "json")
    @Convert(converter = CourseMappedConverter.class)
    private CourseMapped courseMapped;  // have no idea why would you use String json instead of the object to map

    // getters and setters
}

Här är omvandlarexemplet:

@Converter
public class CourseMappedConverter implements AttributeConverter<CourseMapped, PGobject> {
    @Override
    public PGobject convertToDatabaseColumn(CourseMapped courseMapped) {
        try {
            PGobject po = new PGobject();
            // here we tell Postgres to use JSON as type to treat our json
            po.setType("json");
            // this is Jackson already added as dependency to project, it could be any JSON marshaller
            po.setValue((new ObjectMapper()).writeValueAsString(courseMapped));
            return po;
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            return null;
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public CourseMapped convertToEntityAttribute(PGobject po) {
        try {
            return (new ObjectMapper()).readValue(po.getValue(),CourseMapped.class);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
}

Om du verkligen behöver hålla fast vid String JSON-representation i din enhet, kan du göra omvandlare så här för String-typ

implements AttributeConverter<String, PGobject>

Här är ett mycket smutsigt (även om det fungerar) proof of concept, den använder också falsk objektserialisering för att berätta för JPA att objektet ändrades om det var det

https://github.com/sasa7812/psql-cache-evict-POC



  1. SQL INSERT INTO från flera tabeller

  2. fel när du installerar mysqlclient med pip till MacOS Bigsur

  3. PHP mysqli_real_escape_string returnerar tom sträng

  4. Generera en slumpmässig sträng i MySQL