【问题标题】:Spring JPA + CRUD - custom query doesn't allow _ characters?Spring JPA + CRUD - 自定义查询不允许 _ 字符?
【发布时间】:2016-12-26 20:46:57
【问题描述】:

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

我的表也有一个名为“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”后,它停止抱怨,实际上正在返回预期的条目。但同时,它不会从搜索查询中的“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);

}

【问题讨论】:

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


    【解决方案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作为变量名和字段名,先混合大小写。

    另请参阅:

    【讨论】:

    • 我没有注意到我忘记更改 getter 和 setter.. 谢谢!
    • 请记住,您可以将问题标记为已回答或在有用时投票;-)
    猜你喜欢
    • 1970-01-01
    • 2016-01-30
    • 2015-03-25
    • 2015-12-07
    • 2016-04-15
    • 2017-11-15
    • 2012-09-13
    • 2019-03-10
    • 1970-01-01
    相关资源
    最近更新 更多