2016-09-21 41 views
0

下面的方法使用Java實體管理器的createNativeQuery()方法:EntityManager本機查詢語法?

public List<Dog> findDogById(String id) { 

     List<Dog> resultList = new ArrayList<>(); 
     try { 
      resultList = persistence.entityManager().createNativeQuery(" SELECT * FROM DOG WHERE ID = '" + id+ "' ", DogEntity.class).getResultList(); 
     } catch (Exception e) { 
     } 
     return resultList; 
    } 

,我有是,這種方法是不返回結果時,我希望它這樣做的問題。即當我直接通過SQL Developer運行查詢時,我得到了結果,但該方法不會返回相同結果。

我的Syntax是否正確?我不確定這一點:

" SELECT * FROM DOG WHERE ID = '" + id+ "' " 

即我需要兩個'"

回答

1

你的語法是正確的,但你必須在你的代碼的其他問題。

你正默默地忽略異常。你可能會得到一個例外,忽略它,然後返回空列表:

try { 
     resultList = persistence.entityManager().createNativeQuery(" SELECT * FROM DOG WHERE ID = '" + id+ "' ", DogEntity.class).getResultList(); 
    } catch (Exception e) { 
     // If an exception is thrown in this try block, you are ignoring it. 
    } 

如果您使用的查詢,而無需參數綁定,你可以有SQL注入的問題。舉個例子,如果有人發送0' OR 1=1--作爲你的函數中的id,用戶可以得到完整的Dog列表。

使用參數和避免這種問題,查詢也更易讀且不易出錯:

.createNativeQuery(" SELECT * FROM DOG WHERE ID = ?1, DogEntity.class) 
.setParameter(1, id) 
.getResultList(); 
+0

由於我已經加入其中已經表明,引發錯誤時e.printStackTrace()中的查詢嘗試執行。這將解釋返回的空列表? – java123999

+0

接受的答案,因爲它有助於解決我的問題。我的代碼拋出了一個我無視的錯誤。錯誤是我的數據庫更新腳本沒有運行,所以Hibernate正在尋找一個尚未存在的列。 – java123999

0

爲了避免出現問題,你應該使用PARAMS:

Query query = em.createNativeQuery("SELECT * FROM DOG WHERE ID = ?"); 
query.setParameter(1, id);