spring boot direct sql by entitymanager

ใครที่ใช้ Spring boot เชื่อมต่อ database ด้วย JPA เราจะคุ้นเคยกับคำสั่งของมันเช่น save() , findById(), findByField() แต่เมื่อไรที่ลักษณะงานของเรานั้น ต้องรับค่า input มาเป็น raw sql เราจะทำอย่างไร

ใช้งานใน Spring (@Controller,@RestController,@Service,@Repository)

import javax.persistence.EntityManager;
import org.hibernate.SQLQuery;
import org.hibernate.Session;

@PersistenceContext
private EntityManager entityManager;

.....

Session session = entityManager.unwrap(org.hibernate.Session.class);

String sql = "update TABLE set FIELD = y where FIELD_WHERE = 'xxx'";

SQLQuery query = session.createSQLQuery(sql);
int result = query.executeUpdate();

return String.valueOf(result);

ใช้งานนอก Spring ยืมการใช้งานผ่าน service

@Service
public class SomeServiceImpl implements SomeService {

    @PersistenceContext(unitName = "your_persistence_unit_name")
    private EntityManager entityManager;

    @Override
    @Transactional("transactionManager")
    public Session getSession() {
        return entityManager.unwrap(org.hibernate.Session.class);
    }
}

public class Foo{

    public void someMethod(){
        SomeService someService =
        ApplicationContextProvider.getApplicationContext().getBean(SomeService.class);
        Session session = someService.getSession().getSessionFactory().openSession();
        ....
    }
}

@PersistenceContext
A persistence context handles a set of entities which hold data to be persisted in some persistence store (e.g. a database). In particular, the context is aware of the different states an entity can have (e.g. managed, detached) in relation to both the context and the underlying persistence store

Session session = utilService.getSession().getSessionFactory().openSession();

Related posts:

This entry was posted in spring boot. Bookmark the permalink.