spring-data-jpa 查詢視圖

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  視圖結構。

  • 備註:

  1. 中間由於想把view當作table使用,建立了接口Repository,可是總會報錯找不到表或者視圖。

  2. 使用


  3. @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;  
        }
  4. 上面這種方法時候也老是提示no pressi......
  • 參考資料:

http://blog.csdn.net/chaijunkun/article/details/8442406

相關文章
相關標籤/搜索