はじめに
Springの勉強を始めてSpring Data JDBCの@Queryの操作が上手くいかず、
数時間を溶かしたので備忘録として残します。
参考リンク
問題
エラーを吐くわけではないのに、SELECT文がnullで返ってくる。
Users.java(Domain Object)
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Users {
/** 識別ID */
@Id
private Integer id;
/** ユーザ名 */
private String name;
/** パスワード */
private String password;
/** 作成日時 */
private Timestamp created_at;
/** 更新日時 */
private Timestamp updated_at;
}
Repository.java
public interface UsersRepository extends CrudRepository<Users,Integer>{
//ユーザ重複確認
@Query("SELECT * FROM USERS WHERE NAME = ':name'")
List<Users> uniqueUser(String name);
}
Application.java
@SpringBootApplication
public class LearningTimerApplication {
public static void main(String[] args) {
SpringApplication.run(LearningTimerApplication.class, args)
.getBean(LearningTimerApplication.class).execute();
}
@Autowired
UsersRepository users_repository;
private void execute() {
//ユーザチェック
checkUser();
}
private void checkUser() {
//ユーザ名,パスワード
String name = "hogehoge";
//ユーザ名が存在しているかチェック
List<Users> users = users_repository.uniqueUser(name);
System.out.println(users);
}
コンソール
[]
解決方法
Repository.javaのWHERE
に''(シングルクォーテーション)が不要でした。
Repository.javaを見てみる
Repository.java
public interface UsersRepository extends CrudRepository<Users,Integer>{
//ユーザ重複確認
@Query("SELECT * FROM USERS WHERE NAME = ':name'")
List<Users> uniqueUser(String name);
}
SQLに渡したいパラメータは:引数名
で指定できますが、
:引数名
を入れると''(シングルクォーテーション)も入るようです。
つまり、 WHERE NAME = ':name'
と指定していますが、
WHERE NAME = :name
が正しいです。
Repository.java(修正後)
public interface UsersRepository extends CrudRepository<Users,Integer>{
//ユーザ重複確認
@Query("SELECT * FROM USERS WHERE NAME = :name")
List<Users> uniqueUser(String name);
}
コンソール
[Users(id=10, name=hogehoge, password=hogehoge, created_at=2023-08-16 20:26:41.670788, updated_at=2023-08-16 20:26:41.670788)]
終わりに
どなたかの参考になれば幸いです。