GP Coder

Trang chia sẻ kiến thức lập trình Java

  • Java Core
    • Basic Java
    • OOP
    • Exception Handling
    • Multi-Thread
    • Java I/O
    • Networking
    • Reflection
    • Collection
    • Java 8
  • Design pattern
    • Creational Pattern
    • Structuaral Pattern
    • Behavior Pattern
  • Web Service
    • SOAP
    • REST
  • JPA
  • Java library
    • Report
    • Json
    • Unit Test
  • Message Queue
    • ActiveMQ
    • RabbitMQ
  • All
Trang chủ JPA Hibernate Native SQL Queries

Hibernate Native SQL Queries

Đăng vào 24/02/2020 Được đăng bởi GP Coder 7410 Lượt xem

Trong Hibernate, HQL hoặc Criteria Query cho phép chúng ta thực hiện hầu hết mọi truy vấn SQL mong muốn. Tuy nhiên, đôi khi về câu lệnh SQL được tạo ra bởi Hibernate chậm hoặc cần viết câu lệnh phức tạp và thích tạo câu lệnh SQL (SQL gốc) của riêng mình hơn. Với Hibernate cho chúng ta sử dụng Native SQL để thao tác với cơ sở dữ liệu, bao gồm các stored procedures, và tất cả các thao tác create, update, delete và select.

Tương tự như HQL hay Creteria, để tạo đối tượng Native Query chúng ta sẽ sử dụng phương thức createNativeQuery() từ đối tượng Session:


org.hibernate.query.NativeQuery createNativeQuery(java.lang.String s);

<R> org.hibernate.query.NativeQuery<R> createNativeQuery(java.lang.String s, java.lang.Class<R> aClass);

Nội dung

  • 1 Scalar queries
  • 2 Entity queries
  • 3 DTOs (Data Transfer Objects)
  • 4 Handling associations and collections

Scalar queries

Các truy vấn SQL cơ bản nhất là để có được một danh sách các giá trị scalars (column) từ một hoặc nhiều bảng.

Ví dụ lấy tất cả các column của bảng user.


NativeQuery query = session.createNativeQuery("SELECT * FROM user" );
List<Object[]> users = query.getResultList();

Ví dụ lấy fullname và email của 10 user từ vị trí thứ 5


NativeQuery query = session.createNativeQuery("SELECT username, password FROM user ORDER BY username" );
List<Object[]> users = query.setFirstResult(5).setMaxResults(10).getResultList();
users.forEach( user -> {
System.out.println("username: " + user[0] + " | password: " + user[1]);
});

Ví dụ lấy username và password của một user có id là 1


NativeQuery query = session.createNativeQuery("SELECT username, password FROM user where id = :id" );
Object[] user = (Object[]) query.setParameter("id", 1).uniqueResult();
System.out.println("username: " + user[0] + " | password: " + user[1]);

Entity queries

Các truy vấn ở trên là về trả về các giá trị vô hướng từ ResultSet.

Ví dụ sử dụng JPA native query để có được các đối tượng Entity từ một truy vấn Native SQL


NativeQuery query = session.createNativeQuery("SELECT * FROM user", User.class );
List<User> users = query.getResultList();

Sau đây là cú pháp để có được các đối tượng Entity từ một truy vấn Native SQL thông qua addEntity().


NativeQuery query = session.createNativeQuery("SELECT * FROM user" );
List<User> users = query.addEntity(User.class).list();

DTOs (Data Transfer Objects)

Đôi khi chúng ta cần truy vấn một vài column và trả về trực tiếp cho đối tượng DTO, không cần phải thông qua Entity.

Ví dụ:

UserDTO.java


@Data
public class UserDTO {
    private String fullname;
    private String username;
}

Sử dụng ResultTransformer để trả về đượng tượng non-entity.


NativeQuery query = session.createNativeQuery("SELECT fullname, username FROM user" );
List<UserDTO> users = query.setResultTransformer( Transformers.aliasToBean( UserDTO.class ) ).list();

Nếu không muốn trả về DTO, có thể trả về một Map<String, Object> như sau:


NativeQuery query = session.createNativeQuery("SELECT fullname, username FROM user" );
List<Map<String,Object>> mapUsers = query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE).list();
mapUsers.forEach( user -> {
System.out.println(user.get("fullname"));
});

Handling associations and collections

Ví dụ lấy thông tin user và user profile.


List<Object[]> tuples = session.createNativeQuery(
        "SELECT * " +
                "FROM user u " +
                "INNER JOIN user_profile p ON u.id = p.user_id" )
        .addEntity("user", User.class )
        .addJoin( "p", "user.userProfile")
        .list();

for(Object[] tuple : tuples) {
    User user = (User) tuple[0];
    UserProfile userProfile = (UserProfile) tuple[1];
    System.out.println("fullname " + user.getFullname() + " | address " + userProfile.getAddress());
}

Mặc định khi sử dụng addJoin(), kết quả trả về sẽ bao gồm tất cả các entity được join trong 1 array. Để trả về một đối tượng entity hierarchy, chúng ta cần sử dụng ROOT_ENTITY hoặc DISTINCT_ROOT_ENTITY ResultTransformer.

Chi tiết về các truy vấn khác, các bạn tham khảo thêm link bên dưới.

Tài liệu tham khảo:

  • https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#sql
4.9
07
Nếu bạn thấy hay thì hãy chia sẻ bài viết cho mọi người nhé!

Shares

Chuyên mục: JPA Được gắn thẻ: Hibernate, JPA

Hibernate Criteria Query Language (HCQL)
Hibernate Lifecycle

Có thể bạn muốn xem:

  • Hibernate Batch processing (06/04/2020)
  • Hibernate Cache (01/04/2020)
  • Hibernate mapping type (01/11/2019)
  • Hibernate reverse engineering – Customize code generation sử dụng custom strategy class (29/12/2019)
  • Hibernate Logging (03/04/2020)

Bình luận

bình luận

Tìm kiếm

Bài viết mới

  • Giới thiệu CloudAMQP – Một RabbitMQ server trên Cloud 02/10/2020
  • Kết nối RabbitMQ sử dụng Web STOMP Plugin 19/06/2020
  • Sử dụng publisher confirm trong RabbitMQ 16/06/2020
  • Sử dụng Dead Letter Exchange trong RabbitMQ 13/06/2020
  • Sử dụng Alternate Exchange trong RabbitMQ 10/06/2020

Xem nhiều

  • Hướng dẫn Java Design Pattern – Factory Method (56844 lượt xem)
  • Hướng dẫn Java Design Pattern – Singleton (55049 lượt xem)
  • Lập trình đa luồng trong Java (Java Multi-threading) (54507 lượt xem)
  • Giới thiệu Design Patterns (49812 lượt xem)
  • Xây dựng ứng dụng Client-Server với Socket trong Java (49449 lượt xem)

Nội dung bài viết

  • 1 Scalar queries
  • 2 Entity queries
  • 3 DTOs (Data Transfer Objects)
  • 4 Handling associations and collections

Lưu trữ

Thẻ đánh dấu

Annotation Authentication Basic Java Behavior Pattern Collection Creational Design Pattern Cấu trúc điều khiển Database Dependency Injection Design pattern Eclipse Exception Executor Service Google Guice Gson Hibernate How to Interceptor IO Jackson Java 8 Java Core JDBC JDK Jersey JMS JPA json JUnit JWT Message Queue Mockito Multithreading OOP Performance PowerMockito RabbitMQ Reflection Report REST SOAP Structuaral Pattern Thread Pool Unit Test Webservice

Liên kết website

Design Pattern

  • Refactoring Guru
  • Source Making

Lập trình Java

  • JavaTpoint
  • JavaWorld
  • Journaldev
  • TutorialsPoint
  • W3Schools Online Web Tutorials

Giới thiệu

GP Coder là trang web cá nhân, được thành lập với mục đích lưu trữ, chia sẽ kiến thức đã học và làm việc của tôi. Các bài viết trên trang này chủ yếu về ngôn ngữ Java và các công nghệ có liên quan đến Java như: Spring, JSF, Web Services, Unit Test, Hibernate, SQL, ...
Hi vọng góp được chút ít công sức cho sự phát triển cộng đồng Coder Việt.

Tìm kiếm các bài viết của GP Coder với Google Search

Liên hệ

Các bạn có thể liên hệ với tôi thông qua:
  • Trang liên hệ
  • Linkedin: gpcoder
  • Email: contact@gpcoder.com
  • Skype: ptgiang56it

Follow me

Copyright 2022 © GP Coder · All Rights Reserved · Giới thiệu · Chính sách · Điều khoản · Liên hệ ·

sponsored

Share

Blogger
Delicious
Digg
Email
Facebook
Facebook messenger
Google
Hacker News
Line
LinkedIn
Mix
Odnoklassniki
PDF
Pinterest
Pocket
Print
Reddit
Renren
Short link
SMS
Skype
Telegram
Tumblr
Twitter
VKontakte
wechat
Weibo
WhatsApp
Xing
Yahoo! Mail
Powered by WP Socializer

Copy short link

Copy link
Powered by WP Socializer