如何透過Spring Data/EntityManager/Session直接獲取DTO資料?

banq發表於2019-01-30

我們從資料庫中提取資料,才能確定應用程式的執行方式。為了構建最佳的提取計劃,我們需要了解每種提取型別。直接獲取資料是最簡單的,無需編寫任何顯式SQL查詢語句,並且在我們知道實體主鍵時非常有用。

如何透過透過Spring Data EntityManager和Hibernate Session示例直接獲取?
關鍵點:
  • 透過Spring Data直接獲取, findById()
  • 透過EntityManager直接獲取 EntityManagerfind()
  • 透過Hibernate直接獲取 Sessionget()

原始碼可以在這裡找到  

透過Spring Data Projections獲取DTO
獲取比所需資料更多的資料是導致效能損失的最常見問題之一。獲取實體而無意修改它們也是一個壞主意。我們可以透過Spring Data Projections(DTO)僅從資料庫中獲取所需的資料。
假設對於實體User我們只想提取其中的name和city,做成一個DTO物件返回,實體User的程式碼:

@Entity
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String surname;
    private String city;
    private String country;
    private long ssn;
    private int age;


關鍵點:
  • 編寫一個包含getter的介面(投影),僅用於應從資料庫中提取的列

    public interface UserNameAndCity {
        
        String getName();
        String getCity();
    }
    

  • 寫一個返回<projection>的正確查詢List:

    @Repository
    public interface UserRepository extends JpaRepository<User, Long> {
       
        @Transactional(readOnly = true)
        List<UserNameAndCity> findFirst2BySurname(String surname);
    }
    
  • 如果可能,限制返回的行數(例如,via LIMIT)。在這裡,我們可以使用Spring Data儲存庫基礎結構中內建的查詢構建器機制

呼叫:

 List<UserNameAndCity> users = userRepository.findFirst2BySurname("Francisco");

 logger.info(() -> "Number of users:" + users.size());

  for (UserNameAndCity user : users) {
     logger.info(() -> "User:" + user.getName() + ", " + user.getCity());
   }



原始碼可以在這裡找到
 

相關文章