1. 程式人生 > >SpringData : xxx_xxx is not mapped

SpringData : xxx_xxx is not mapped

trac HERE 進行 mapped 最好的 實現 cep exception inter

今天寫一個查詢語句的時候,報錯如下

org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name ‘tag_ArticleRepository‘:
Invocation of init method failed; 
nested exception is java.lang.IllegalArgumentException: 
Failed to create query method 
public abstract java.util.List com.fdzang.mblog.repository.Tag_ArticleRepository.getByTag_oId(java.lang.String)! 
No property tag found 
for type Tag_Article!

查詢Repository如下

package com.fdzang.mblog.repository;

import com.fdzang.mblog.pojo.Tag_Article;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface Tag_ArticleRepository extends JpaRepository<Tag_Article,String> {
    List
<Tag_Article> getByTag_oId(String tag_oId); }

一開始想到的是肯定是下劃線會出問題,因為JPA對於命名規範比較嚴格,於是使用@Query註解進行測試

 @Query("SELECT ta FROM tag_article ta WHERE ta.tag_oId = :tag_oId")
    List<Tag_Article> getByTag_oId(@Param("tag_oId") String tag_oId);

報錯如下

tag_article is not mapped

後來經過一番挫折,終於找到錯誤在哪兒了

 @Query("SELECT ta FROM Tag_Article ta WHERE ta.tag_oId = :tag_oId")
    List<Tag_Article> getByTag_oId(@Param("tag_oId") String tag_oId);

在@Query註解中,應該是實體的名稱,而非數據庫的表名,區分大小寫

這個應該是Hibernate的底層實現原因,怪自己對Hibernate不熟悉而造成的

最後,總結一下:

技術分享圖片

以上是尚矽谷佟剛老師的SpringData教程,大致意思是在SpringDate的簡單查詢中,下劃線有著特定的意思

他的解析會優先於在類裏對比屬性

如本次的 getByTag_oId() 就會解析為Tag_Article.Tag.oId 而不是Tag_Article.Tag_oId

因為下劃線的優先級比較高,因此會先解析下劃線,而後在類裏進行比較

遇到這種問題的時候我們就可以基於註解開發了,畢竟SpringData的簡單查詢雖然簡單,但是因為死板,所以命名方面比較苛刻

當然,最好的就還是別用這該死的下劃線了!哈哈

SpringData : xxx_xxx is not mapped