JPA Native Query选择和转换对象
我有一个扩展User
的对象Admin
。 默认情况下,两个对象都在我的Derby数据库的User_
表中(来自Admin
包含字段)。 通常我会像这样选择一个User
:
CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery 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();
虽然这会抛出一个强制转换exception。 我认为这是由于Admin
任何字段。
我的问题是,如何使用具有相同结果的本机查询作为第一个示例选择User
(包括@LOB
和@ManyToOne
(等等)的相同值,因为JPQL查询将返回)?
您可能想尝试以下方法之一:
-
使用
createNativeQuery(sqlString, resultClass)
方法createNativeQuery(sqlString, resultClass)
也可以使用
EntityManager.createNativeQuery()
API动态定义本机查询。String sql = "SELECT USER.* FROM USER_ AS USER WHERE ID = ?"; Query query = em.createNativeQuery(sql, User.class); query.setParameter(1, id); User user = (User) query.getSingleResult();
-
使用注释
@NamedNativeQuery
本机查询是通过
@NamedNativeQuery
和@NamedNativeQueries
注释或
XML元素定义的。@NamedNativeQuery( name="complexQuery", query="SELECT USER.* FROM USER_ AS USER WHERE ID = ?", resultClass=User.class ) public class User { ... } Query query = em.createNamedQuery("complexQuery", User.class); query.setParameter(1, id); User user = (User) query.getSingleResult();
您可以在优秀的开放式书籍Java Persistence (以PDF格式提供 )中阅读更多内容。
───────
注意 :关于getSingleResult()
,请参阅为什么你不应该在JPA中使用getSingleResult()
。
请参阅JPA:如何将本机查询结果集转换为POJO类集合
对于Postgres 9.4
,
List 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);
首先创建一个模型POJO
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 actionIndex() { EntityManager em = emf.createEntityManager(); // Without parameter List arr_cust = (List )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; } }