1.添加maven依赖
| <dependency> |
| <groupId>com.vladmihalcea</groupId> |
| <artifactId>hibernate-types-52</artifactId> |
| <version>${hibernate-types.version}</version> |
| </dependency> |
| |
2. 申明类型
| @TypeDefs({ |
| @TypeDef(name = "json", typeClass = JsonStringType.class), |
| @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class) |
| }) |
| @MappedSuperclass |
| public class BaseEntity { |
| |
| } |
| |
MYSQL
Entity
| @Entity(name = "Event") |
| @Table(name = "event") |
| public class Event extends BaseEntity { |
| |
| @Type(type = "json") |
| @Column(columnDefinition = "json") |
| private Location location; |
| |
| public Location getLocation() { |
| return location; |
| } |
| |
| public void setLocation(Location location) { |
| this.location = location; |
| } |
| } |
| |
| @Entity(name = "Participant") |
| @Table(name = "participant") |
| public class Participant extends BaseEntity { |
| |
| @Type(type = "json") |
| @Column(columnDefinition = "json") |
| private Ticket ticket; |
| |
| @ManyToOne |
| private Event event; |
| |
| public Ticket getTicket() { |
| return ticket; |
| } |
| |
| public void setTicket(Ticket ticket) { |
| this.ticket = ticket; |
| } |
| |
| public Event getEvent() { |
| return event; |
| } |
| |
| public void setEvent(Event event) { |
| this.event = event; |
| } |
| } |
| |
测试
| final AtomicReference<Event> eventHolder = new AtomicReference<>(); |
| final AtomicReference<Participant> participantHolder = new AtomicReference<>(); |
| |
| doInJPA(entityManager -> { |
| Event nullEvent = new Event(); |
| nullEvent.setId(0L); |
| entityManager.persist(nullEvent); |
| |
| Location location = new Location(); |
| location.setCountry("Romania"); |
| location.setCity("Cluj-Napoca"); |
| |
| Event event = new Event(); |
| event.setId(1L); |
| event.setLocation(location); |
| entityManager.persist(event); |
| |
| Ticket ticket = new Ticket(); |
| ticket.setPrice(12.34d); |
| ticket.setRegistrationCode("ABC123"); |
| |
| Participant participant = new Participant(); |
| participant.setId(1L); |
| participant.setTicket(ticket); |
| participant.setEvent(event); |
| |
| entityManager.persist(participant); |
| |
| eventHolder.set(event); |
| participantHolder.set(participant); |
| }); |
| |
| INSERT INTO event (location, id) |
| VALUES (NULL(OTHER), 0) |
| |
| INSERT INTO event (location, id) |
| VALUES ('{"country":"Romania","city":"Cluj-Napoca"}', 1) |
| |
| INSERT INTO participant (event_id, ticket, id) |
| VALUES (1, {"registrationCode":"ABC123","price":12.34}, 1) |
| |
| Event event = entityManager.find(Event.class, eventHolder.get().getId()); |
| |
| assertEquals("Cluj-Napoca", event.getLocation().getCity()); |
| |
| Participant participant = entityManager.find( |
| Participant.class, participantHolder.get().getId()); |
| assertEquals("ABC123", participant.getTicket().getRegistrationCode()); |
| |
| List<String> participants = entityManager.createNativeQuery( |
| "SELECT p.ticket -> \"$.registrationCode\" " + |
| "FROM participant p " + |
| "WHERE JSON_EXTRACT(p.ticket, \"$.price\") > 1 ") |
| .getResultList(); |
| |
| event.getLocation().setCity("Constanța"); |
| entityManager.flush(); |
| UPDATE event |
| SET location = '{"country":"Romania","city":"Constanța"}' |
| WHERE id = 1 |
POSTGRESQL
| @Type(type = "jsonb") |
| @Column(columnDefinition = "json") |
| private Location location; |
| |
| @Type(type = "jsonb") |
| @Column(columnDefinition = "json") |
| private Ticket ticket; |
| List<String> participants = entityManager.createNativeQuery( |
| "SELECT p.ticket ->>'registrationCode' " + |
| "FROM participant p " + |
| "WHERE p.ticket ->> 'price' > '10'") |
| .getResultList(); |
| @Type(type = "jsonb") |
| @Column(columnDefinition = "jsonb") |
| private Location location; |
| |
| @Type(type = "jsonb") |
| @Column(columnDefinition = "jsonb") |
| private Ticket ticket; |
| |
| List<String> participants = entityManager.createNativeQuery( |
| "SELECT jsonb_pretty(p.ticket) " + |
| "FROM participant p " + |
| "WHERE p.ticket ->> 'price' > '10'") |
| .getResultList(); |
| |
转载来源:https://blog.csdn.net/ninja_/article/details/108916530
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)