Spring JPA + CRUD - 自定义查询不允许_字符?

时间:2016-08-19 15:56:22

标签: java spring spring-mvc spring-data-jpa crud

我在spring中创建自定义查询时遇到麻烦,因为我的Entity在其参数的名称中包含一个“_”字符:“game_date”。

我的表也有一个名为“game_date”的列。

我创建了以下方法:

List<Games> findByGame_dateAndOpponent(@Param("game_date") Date game_date, @Param("opponent") String opponent);

但是当我启动我的应用程序时,除了类型之外它崩溃了:“org.springframework.data.mapping.PropertyReferenceException:找不到类型游戏的属性gamedate!”。在Entity和Query方法中将参数名称更改为“gameDate”之后,它停止了抱怨,并且实际上正在返回预期的条目。但与此同时,它不会在搜索查询中返回“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);

}

1 个答案:

答案 0 :(得分:1)

下划线是Spring Data JPA中的reserved keyword。它应该足以从你的属性和它的getter和setter中删除它,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用于变量和字段名称,这是首先使用小写的大小写混合。

另见: