Spring JPA + CRUD - 自定义查询不允许 _ 个字符?
Spring JPA + CRUD - custom query doesn't allow _ characters?
我在 spring 中创建自定义查询时遇到问题,因为我的实体在其参数名称中包含一个“_”字符:"game_date"。
我的 table 也有一个名为 "game_date" 的列。
我创建了以下方法:
List<Games> findByGame_dateAndOpponent(@Param("game_date") Date game_date, @Param("opponent") String opponent);
但是当我启动我的应用程序时,它崩溃了,但出现了以下异常:"org.springframework.data.mapping.PropertyReferenceException: No property gamedate found for type Games!"。在 Entity 和 Query 方法中将参数名称更改为 "gameDate" 后,它停止了抱怨,实际上是 returning 预期的条目。但与此同时,它不会在搜索查询中 return 列 "game_date" 中的值,这是 Date 类型的简单常规列。我不知道这一切是怎么回事。
我使用的数据库是MySql。
下面是代码本身:
实体:
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
@Table(name = "games")
public class Games {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id_game")
private int id;
@Column(name = "game_date", columnDefinition = "DATE")
@Temporal(TemporalType.DATE)
private Date gameDate;
public Date getGame_date() {
return gameDate;
}
public void setGame_date(Date _game_date) {
this.gameDate = _game_date;
}
}
还有一个存储库:
import java.sql.Date;
import java.util.List;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
@RepositoryRestResource
public interface GamesRepository extends CrudRepository< Games , Integer > {
List< Games > findById( @Param( "id" ) int id );
List< Games > findAll( );
List<Games> findByGameDateAndOpponent(@Param("game_date") Date game_date, @Param("opponent") String opponent);
}
下划线是 Spring Data JPA 中的 reserved keyword。从你的 属性 和它的 getters 和 setters 中删除它应该足够了,Hibernate 将完成剩下的工作:
@Entity
@Table(name = "games")
public class Games {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id_game")
private int id;
//Getter and setters for id
@Column(name = "game_date")
private Date gameDate;
public Date getGameDate() {
return gameDate;
}
public void setGameDate(Date gameDate) {
this.gameDate = gameDate;
}
}
另外,一般情况下,尽量使用java naming convention作为变量名和字段名,先小写混合。
另请参阅:
我在 spring 中创建自定义查询时遇到问题,因为我的实体在其参数名称中包含一个“_”字符:"game_date"。
我的 table 也有一个名为 "game_date" 的列。
我创建了以下方法:
List<Games> findByGame_dateAndOpponent(@Param("game_date") Date game_date, @Param("opponent") String opponent);
但是当我启动我的应用程序时,它崩溃了,但出现了以下异常:"org.springframework.data.mapping.PropertyReferenceException: No property gamedate found for type Games!"。在 Entity 和 Query 方法中将参数名称更改为 "gameDate" 后,它停止了抱怨,实际上是 returning 预期的条目。但与此同时,它不会在搜索查询中 return 列 "game_date" 中的值,这是 Date 类型的简单常规列。我不知道这一切是怎么回事。
我使用的数据库是MySql。
下面是代码本身:
实体:
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
@Table(name = "games")
public class Games {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id_game")
private int id;
@Column(name = "game_date", columnDefinition = "DATE")
@Temporal(TemporalType.DATE)
private Date gameDate;
public Date getGame_date() {
return gameDate;
}
public void setGame_date(Date _game_date) {
this.gameDate = _game_date;
}
}
还有一个存储库:
import java.sql.Date;
import java.util.List;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
@RepositoryRestResource
public interface GamesRepository extends CrudRepository< Games , Integer > {
List< Games > findById( @Param( "id" ) int id );
List< Games > findAll( );
List<Games> findByGameDateAndOpponent(@Param("game_date") Date game_date, @Param("opponent") String opponent);
}
下划线是 Spring Data JPA 中的 reserved keyword。从你的 属性 和它的 getters 和 setters 中删除它应该足够了,Hibernate 将完成剩下的工作:
@Entity
@Table(name = "games")
public class Games {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id_game")
private int id;
//Getter and setters for id
@Column(name = "game_date")
private Date gameDate;
public Date getGameDate() {
return gameDate;
}
public void setGameDate(Date gameDate) {
this.gameDate = gameDate;
}
}
另外,一般情况下,尽量使用java naming convention作为变量名和字段名,先小写混合。
另请参阅: