복붙노트

[SQL] JPA 기본 쿼리를 선택하고 캐스트 객체

SQL

JPA 기본 쿼리를 선택하고 캐스트 객체

나는 사용자를 확장하는 개체 관리를 가지고있다. 기본적으로 두 개체는 테이블 내 더비 데이터베이스의 USER_ (관리에서 포함 필드)에 있습니다. 일반적으로 나는이 같은 사용자를 선택할 것입니다 :

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root user= query.from(User.class);
Predicate predicateId = cb.equal(category.get("id"), id);
query.select(user).where(predicateId);
return em.createQuery(query).getSingleResult();

그러나 내 쿼리의 복잡성이 같은 네이티브 쿼리를 사용하고 있습니다 때문에 :

Query query = em.createNativeQuery("SELECT USER.* FROM USER_ AS USER WHERE ID = ?");
query.setParameter(1, id);
return (User) query.getSingleResult();

이 캐스트 예외가 발생하지만. 나는이 관리자에서 어떤 필드에 기인한다 그림.

내 질문은 어떻게 (반환 것 JPQL 쿼리로) 등등 @LOB와 @ManyToOne (에 대해 동일한 값을 포함) 최초의 예로서 동일한 결과를 네이티브 쿼리를 사용하여 사용자를 선택할 수있다?

해결법

  1. ==============================

    1.다음과 같은 방법 중 하나를 시도 할 수 있습니다 :

    다음과 같은 방법 중 하나를 시도 할 수 있습니다 :

    당신은 훌륭한 책 (PDF로 제공) 자바 지속성에서 자세한 내용을보실 수 있습니다.

    ─────── 참고 : getSingleResult ()의 사용과 관련하여, 당신은 JPA에 getSingleResult ()를 사용하지 않을해야하는 이유를 참조하십시오.

  2. ==============================

    2.허용 대답이 올바르지 않습니다.

    허용 대답이 올바르지 않습니다.

    createNativeQuery는 항상 쿼리를 반환합니다 :

    public Query createNativeQuery(String sqlString, Class resultClass);
    

    쿼리에 getResultList를 호출하면 목록을 반환합니다 :

    List getResultList()
    

    할당 (또는 주조) 목록 에 때, 체크되지 않은 할당 경고가 생성됩니다.

    반면, createQuery는 TypedQuery를 반환합니다 :

    public <T> TypedQuery<T> createQuery(String qlString, Class<T> resultClass);
    

    TypedQuery에 getResultList를 호출하면 목록 를 반환합니다.

    List<X> getResultList();
    

    이 제대로 입력하고 경고를 제공하지 않습니다.

    createNativeQuery으로 ObjectMapper를 사용하여 경고를 제거하는 유일한 방법이 될 것으로 보인다. 개인적으로, 나는 내가 걱정해야 뭔가를 라이브러리의 부족으로이 문제를보고하지, 경고를 억제하기 위해 선택합니다.

  3. ==============================

    3.JPA를 참조하십시오 : POJO 클래스 컬렉션에 네이티브 쿼리 결과 세트를 변환하는 방법

    JPA를 참조하십시오 : POJO 클래스 컬렉션에 네이티브 쿼리 결과 세트를 변환하는 방법

    포스트 그레스 9.4의 경우,

    List<String> list = em.createNativeQuery("select cast(row_to_json(u) as text) from myschema.USER_ u WHERE ID = ?")
                       .setParameter(1, id).getResultList();
    
    User map = new ObjectMapper().readValue(list.get(0), User.class);
    
  4. ==============================

    4.네이티브 쿼리가 조인을 기반으로 할 때, 그 경우에 당신은 객체의 목록으로 결과를 얻을하고 처리 할 수 ​​있습니다.

    네이티브 쿼리가 조인을 기반으로 할 때, 그 경우에 당신은 객체의 목록으로 결과를 얻을하고 처리 할 수 ​​있습니다.

    간단한 예.

    @Autowired
    EntityManager em;
    
        String nativeQuery = "select name,age from users where id=?";   
        Query query = em.createNativeQuery(nativeQuery);
        query.setParameter(1,id);
    
        List<Object[]> list = query.getResultList();
    
        for(Object[] q1 : list){
    
            String name = q1[0].toString();
            //..
            //do something more on 
         }
    
  5. ==============================

    5.

    import javax.persistence.*;
    @Entity
    @Table(name = "sys_std_user")
    public class StdUser {
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name = "class_id")
        public int classId;
        @Column(name = "user_name")
        public String userName;
        //getter,setter
    }
    
    import com.example.demo.models.*;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.PersistenceUnit;
    import java.util.List;
    
    @RestController
    public class HomeController {
        @PersistenceUnit
        private EntityManagerFactory emf;
    
        @GetMapping("/")
        public List<StdUser> actionIndex() {
            EntityManager em = emf.createEntityManager(); // Without parameter
            List<StdUser> arr_cust = (List<StdUser>)em
                    .createQuery("SELECT c FROM StdUser c")
                    .getResultList();
            return arr_cust;
        }
    
        @GetMapping("/paramter")
        public List actionJoin() {
            int id = 3;
            String userName = "Suresh Shrestha";
            EntityManager em = emf.createEntityManager(); // With parameter
            List arr_cust = em
                    .createQuery("SELECT c FROM StdUser c WHERE c.classId = :Id ANd c.userName = :UserName")
                    .setParameter("Id",id)
                    .setParameter("UserName",userName)
                    .getResultList();
            return arr_cust;
        }
    }
    
  6. from https://stackoverflow.com/questions/17708946/jpa-native-query-select-and-cast-object by cc-by-sa and MIT license