spring-data-jpa 查詢視圖,報錯,找不到table或者視圖!花了一天的時間在網上找了一份資料,親測後分享給你們,參見:參考資料。java
Controller層spring
@RestController @RequestMapping("/api") @ComponentScan public class UserCertificationController extends BaseController { @Autowired private UserCertificationService userCerService; /** * 視圖查詢Demo,返回值data * * @return {"data":[{"id":"1","user_name":"mo","userid":"mo101"}],"code":"200","msg":"success"} */ @RequestMapping(value = "/findKdOrView", method = RequestMethod.GET) public String findKdOrView() { List<KdOrView> vlist = this.userCerService.findKdByNativeSQL(); return renderSuccess(vlist); } }
Service層sql
ObjectDaoService 是共通數據庫
ObjectDaoService.javaapi
public interface ObjectDaoService { EntityManager getEntityManager(); }
ObjectDaoServiceImpl.javaoracle
@Service public class ObjectDaoServiceImpl implements ObjectDaoService { @PersistenceContext private EntityManager entityManager; @Override public EntityManager getEntityManager(){ return this.entityManager; } }
業務邏輯層app
UserCertificationServicedom
@Service public interface UserCertificationService { public List<KdOrView> findKdByNativeSQL(); }
UserCertificationServiceImplide
@Service public class UserCertificationServiceImpl implements UserCertificationService { @Resource private ObjectDaoService objectDaoService; public List<KdOrView> findKdByNativeSQL() { // 1.組織sql語句,這裏設置參數 ":id" 方式,還有一種是 "?1,?2",須要指定 String sql = "select id,user_name,userid from kdorview k where k.id = :id"; // 2.建立實體管理對象 EntityManager entityManager = objectDaoService.getEntityManager(); // 3.使用jpa 包裝查詢,獲取query 對象 Query query = entityManager.createNativeQuery(sql); // 4.再使用去包裝查詢獲取 nativeQuery 對象 SQLQuery nativeQuery = query.unwrap(SQLQuery.class); // 5.設置參數,對應上面的參數 ":id" nativeQuery.setParameter("id", "1"); // 設置返回值類型Map,而後對Map進行處理。 nativeQuery.setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP); // 6.執行查詢,獲取viewlist List<KdOrView> viewlist = new ArrayList<KdOrView>(); // 解析viewlist,根據功能邏輯封裝 @SuppressWarnings("unchecked") List<Map<String, Object>> retVal = nativeQuery.list(); if (retVal != null && retVal.size() > 0) { for (Map<String, Object> map : retVal) { KdOrView kv = new KdOrView(); // key字段所有要大寫,這裏使用的是oracle數據庫 kv.setId(map.get("ID").toString()); kv.setUser_name(map.get("USER_NAME").toString()); kv.setUserid(map.get("USERID").toString()); viewlist.add(kv); } } return viewlist; }
Domainthis
// domain 中不須要任何的註解,這是一個映射到視圖的enity,並無真實的表。 public class KdOrView implements Serializable { /** * */ private static final long serialVersionUID = 1L; // KD Table Field private String id; private String user_name; // Or Table Field private String userid; public KdOrView() { } public KdOrView(String id, String user_name, String userid) { this.id = id; this.user_name = user_name; this.userid = userid; } // GET SET....... 省略 }
DB View:kdorView 視圖結構。
備註:
中間由於想把view當作table使用,建立了接口Repository,可是總會報錯找不到表或者視圖。
使用
@Override public List<Report> getReport() { String jpql= String.format("select new %3$s(a.deptId, a.deptName, (select count(*) from %2$s b where b.deptId= a.deptId) as totalCount) from %1$s a", Depts.class.getName(), Students.class.getName(), Report.class.getName()); EntityManager entityManager= objectDaoService.getEntityManager(); //創建有類型的查詢 TypedQuery<Report> reportTypedQuery= entityManager.createQuery(jpql, Report.class); //另外有詳細查詢條件的在jpql中留出參數位置來(?1 ?2 ?3....),而後在這設置 //reportTypedQuery.setParameter(1, params); List<Report> reports= reportTypedQuery.getResultList(); return reports; }
上面這種方法時候也老是提示no pressi......
參考資料:
http://blog.csdn.net/chaijunkun/article/details/8442406