如何透過SqlResultSetMapping和NamedNativeQuery生成DTO?
獲取超出你實際需要的資料容易導致效能損失。使用DTO可以讓我們只提取所需的資料。在這裡我們展示依賴SqlResultSetMapping,NamedNativeQuery和EntityManager實現DTO。
假設需要從實體Car中獲取name和color兩項資料的CarDto,Car程式碼如下,在其中使用了註釋@SqlResultSetMapping,@NamedNativeQuery:
@NamedNativeQuery( name="CarDto", query="select name, color from car", resultSetMapping="CarDto" ) @SqlResultSetMapping( name="CarDto", classes=@ConstructorResult( targetClass=CarDto.class, columns={ @ColumnResult(name="name"), @ColumnResult(name="color") } ) ) @Entity @Table(name = "car") public class Car implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String engine; private String color; |
CarDto程式碼:
public class CarDto implements Serializable { private static final long serialVersionUID = 1L; private final String name; private final String color; public CarDto(String name, String color) { this.name = name; this.color = color; } public String getName() { return name; } public String getColor() { return color; } @Override public String toString() { return "CarDto{" + "name=" + name + ", color=" + color + '}'; } } |
第二步,編制DTO呼叫EntityManager的createNameQuery返回CarDto的List:
@Repository @Transactional public class Dao<T, ID extends Serializable> implements GenericDao<T, ID> { @PersistenceContext private EntityManager entityManager; @Override public <S extends T> S persist(S entity) { Objects.requireNonNull(entity, "Cannot persist a null entity"); entityManager.persist(entity); return entity; } @Transactional(readOnly=true) public List<CarDto> fetchCars() { Query query = entityManager.createNamedQuery("CarDto"); List<CarDto> result = query.getResultList(); return result; } protected EntityManager getEntityManager() { return entityManager; } } Service呼叫: |
@Service public class CarService { private final Dao dao; public CarService(Dao dao) { this.dao = dao; } public List<CarDto> fetchCars() { return dao.fetchCars(); } } |
也可以使用Spring data project投影實現獲取DTO,參考https://www.jdon.com/51628 。
相關文章
- 如何透過Hibernate/JPA的SqlResultSetMapping生成需要資料的DTO?SQLAPP
- 如何透過建構函式和JPQL生成DTO?函式
- 如何透過ResultTransformer和原生SQL或JPQL生成DTO?ORMSQL
- 如何透過javax.persistence.Tuple和原生SQL生成DTO?JavaSQL
- 如何透過javax.persistence.Tuple和JPQL提取DTO?Java
- 如何透過Spring Data/EntityManager/Session直接獲取DTO資料?SpringSession
- 詳解Dart中如何透過註解生成程式碼Dart
- 如何生成文字: 透過 Transformers 用不同的解碼方法生成文字ORM
- 如何使用Spring Projections和Join實現DTO?SpringProject
- 如何透過babel去操作ast, 並生成對應的程式碼。BabelAST
- JPA透過表反向生成相關類
- HarmonyOS開發:透過文字生成碼圖
- java使用bytebuddy動態生成帶泛型的DTOJava泛型
- 使用IDEA+groovy快速生成entity、dto、dao、service、serviceImplIdea
- 如何在 GNU Linux 上透過 Nvm 安裝 Node 和 Npm?LinuxNPM
- 如何透過DBeaver 連線 TDengine?
- 如何透過kubernetes-部署RabbitMQMQ
- Springboot透過谷歌Kaptcha 元件,生成圖形驗證碼Spring Boot谷歌APT元件
- CMakeFile.txt透過sysroot方式後生成makefile報錯
- 微服務之間如何共享DTO?微服務
- 如何透過分解和增量更改將單體遷移到微服務?微服務
- 使用AI識別語音和B站影片並透過GPT生成思維導圖AIGPT
- Docker - 透過IDEA和Dockerfile部署springbDockerIdeaSpring
- 如何透過iPaaS快速整合SAP ERP
- 如何透過ForkJoinPool和HikariCP將大型JSON檔案批次處理到MySQL?JSONMySql
- 如何透過簡訊轉發在iPad和Mac上傳送和接收簡訊iPadMac
- 透過ssh工具啟動VNC,Windows系統如何透過ssh工具啟動VNCVNCWindows
- 透過ModelScope開源多模態Embedding模型進行向量生成模型
- 跨境電商如何透過API選品API
- CRM系統透過特性如何選擇?
- 如何透過SQLyog分析MySQL資料庫MySql資料庫
- 如何透過 Alt 鍵打出所有特殊字元?字元
- 如何透過ZBlogPHP啟用Gzip壓縮?PHP
- 【Mysql】如何透過binlog恢復資料MySql
- 如何透過 Geth、Node.js 和 UNIX/PHP 訪問以太坊節點Node.jsPHP
- 如何透過文字服務轉發在iPad和Mac上傳送和接收簡訊iPadMac
- 如何透過PMP認證?5個準備步驟讓你輕鬆透過考試!
- 透過Docker Compose部署GitLab和GitLab Runner(一)DockerGitlab