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 . 14208 Lượt xem . Toàn màn hình

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
08
Nếu bạn thấy hay thì hãy chia sẻ bài viết cho mọi người nhé! Và Donate tác giả

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:

  • Sử dụng Hibernate Tool tạo các Hibernate Entity một cách tự động từ các table (26/11/2019)
  • Hibernate Batch processing (06/04/2020)
  • Hibernate reverse engineering – Customize code generation sử dụng custom strategy class (29/12/2019)
  • Hibernate Query Language (HQL) (13/02/2020)
  • Hibernate Logging (03/04/2020)

Bình luận

bình luận

Tìm kiếm

Bài viết mới

  • Clean code 13/01/2024
  • 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

Xem nhiều

  • Hướng dẫn Java Design Pattern – Factory Method (98033 lượt xem)
  • Hướng dẫn Java Design Pattern – Singleton (97680 lượt xem)
  • Giới thiệu Design Patterns (87732 lượt xem)
  • Lập trình đa luồng trong Java (Java Multi-threading) (86400 lượt xem)
  • Giới thiệu về Stream API trong Java 8 (83806 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 PowerMockito RabbitMQ Reflection Report REST SOAP Structuaral Pattern Swagger Thread Pool Unit Test Webservice

Liên kết

  • Clean Code
  • JavaTpoint
  • Refactoring Guru
  • Source Making
  • 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.

Donate tác giả

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 2025 © GP Coder · All Rights Reserved · Giới thiệu · Chính sách · Điều khoản · Liên hệ ·

Share

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

Copy short link

Copy link