使用spring-data-jpa進行count時報錯No property count found for type xxx的解決方案

在用spring做count查詢的時候,遇到了一個有點詭異的報錯。首先,這裏有一張表:

CREATE TABLE t_user (
   user_id   INT AUTO_INCREMENT PRIMARY KEY,
   user_name VARCHAR(30),
   password  VARCHAR(32)
);

是一張很普通的數據表,並沒有任何奇怪的地方。然後,配置好JPA之後(配置就不發了,想必遇到這個報錯的人已經跑起來了),我寫了這樣一個repository:

public interface UserRegistry extends JpaRepository<User, Integer> {
    long countByUserNameAndPassword(
            String userName,
            String password
    );
}

這個看上去也沒啥問題,但是運行的時候就報錯了。一般來說這個問題就是配置沒寫對,但是IDEA能正常提示,而且官網也是這麼寫的:

interface UserRepository extends CrudRepository<User, Long> {
  long countByLastname(String lastname);
}

用JpaRepository還是CrudRepository無關緊要,並不是這裏的問題,而且我把這個方法註釋掉之後就能跑了,也就是說,就是這個方法出了問題。問題是這怎麼可能呢?我反反覆覆看了很長時間也沒看出問題來,最後索性寫了個老式的@Query

public interface UserRegistry extends JpaRepository<User, Integer> {
    @Query("select count(userId) from User where userName = :userName and password = :password")
    long countByUserNameAndPassword(
            @Param("userName") String userName,
            @Param("password") String password
    );
}

這次能跑了。我突然想到,會不會是版本的問題,於是我跑去查了一下maven的依賴:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>1.3.2.RELEASE</version>
</dependency>

這個版本是2013年5月發佈的,而官方文檔是基於今年才發佈的2.2.5編寫的,中間整整差了一個大版本……估計問題就在版本上了。但是因爲整個項目比較老,不敢隨便升級(偷偷升級之後發現依賴崩了,趕緊回滾),於是放棄,倒回去寫@query

但是在我印象中,這個寫法好像已經有很久了,爲了確定一下,我去查了一些資料,然後發現:

As of Spring Data 1.7.1.RELEASE you can do it with two different ways,

  1. The new way, using query derivation for both count and delete queries.

  2. The old way, Using @Query annotation.

也就是說,這種countBy的寫法直到1.7.1才被支持,這個1.3.2的版本顯然是不支持的。很有意思的是,1.7.1是2014年10月發佈的,所以會給我一種已經用了很久的錯覺。

但是這也太坑了吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章