如何透過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?函式
- 如何透過javax.persistence.Tuple和原生SQL生成DTO?JavaSQL
- 如何透過ResultTransformer和原生SQL或JPQL生成DTO?ORMSQL
- 如何透過javax.persistence.Tuple和JPQL提取DTO?Java
- 如何透過Spring Data/EntityManager/Session直接獲取DTO資料?SpringSession
- 詳解Dart中如何透過註解生成程式碼Dart
- 透過shell指令碼定位效能sql和生成報告指令碼SQL
- 透過shell解析dump生成parfile
- 如何透過babel去操作ast, 並生成對應的程式碼。BabelAST
- 如何使用Spring Projections和Join實現DTO?SpringProject
- JPA透過表反向生成相關類
- 如何透過DBeaver 連線 TDengine?
- 微服務之間如何共享DTO?微服務
- 如何透過設計提升網站的氣質和品質?網站
- java使用bytebuddy動態生成帶泛型的DTOJava泛型
- 使用IDEA+groovy快速生成entity、dto、dao、service、serviceImplIdea
- 如何透過分解和增量更改將單體遷移到微服務?微服務
- 如何在 GNU Linux 上透過 Nvm 安裝 Node 和 Npm?LinuxNPM
- 跨境電商如何透過API選品API
- 使用AI識別語音和B站影片並透過GPT生成思維導圖AIGPT
- 透過shell指令碼生成查詢表資料的sql指令碼SQL
- netbeans透過wsdl生成webservice的UTF8問題BeanWeb
- CMakeFile.txt透過sysroot方式後生成makefile報錯
- 透過ssh工具啟動VNC,Windows系統如何透過ssh工具啟動VNCVNCWindows
- 如何透過SQLyog分析MySQL資料庫MySql資料庫
- 如何透過kubernetes-部署RabbitMQMQ
- 如何透過iPaaS快速整合SAP ERP
- CRM系統透過特性如何選擇?
- 如何透過 Alt 鍵打出所有特殊字元?字元
- Springboot透過谷歌Kaptcha 元件,生成圖形驗證碼Spring Boot谷歌APT元件
- 透過shell指令碼生成資料統計資訊的報表指令碼
- 如何透過ForkJoinPool和HikariCP將大型JSON檔案批次處理到MySQL?JSONMySql
- 如何透過 Geth、Node.js 和 UNIX/PHP 訪問以太坊節點Node.jsPHP
- 如何透過簡訊轉發在iPad和Mac上傳送和接收簡訊iPadMac
- Java求職者如何提高面試的透過率?Java求職面試
- 如何透過 Serverless 提高 Java 微服務治理效率?ServerJava微服務
- 如何透過華為分析提升產品留存率?