【问题标题】:Repository queries and Entity instance variable names存储库查询和实体实例变量名称
【发布时间】:2016-12-29 07:57:52
【问题描述】:

我正在尝试在我的 Spring Repository 类中使​​用这样的方法:

public
interface
ToolRepository extends Repository<Tool, Long>
{
    public Tool findByNumber(String inNumber);
}

使用这样定义的实体列。请注意,虽然我明确地将列命名为“number”,但 Spring(或 Hibernate)看到实际的成员变量名称“mNumber”并且无法生成正确的查询。

import javax.persistence.Column;

@Entity
@Table(name = "Tool")
public
class
Tool implements Serializable
{
    @Column(name = "number")    protected Integer   mNumber;

    public Integer  getNumber()                 { return mNumber; }
    protected void  setNumber(Integer inVal)    { mNumber = inVal; }
}

是否有注解来指定 Spring 在解释查询时应该使用的名称?

这段代码是用spring-boot1.4.3.RELEASE构建的,我用的是Postgres。

【问题讨论】:

  • 您确定您使用的是“正确的”@Column,您导入的注解是否正确!?
  • @luk2302,我正在使用 javax.persistence.Column
  • @Surace 不应该是必需的,它应该完全按照 OP 的预期工作。
  • 删除你的 mNumber 的 getter 和 setter,让 IDE 重新生成。
  • 是的,正如@SaiYeYanNaingAye 所建议的那样,为mNumber 重新创建setter/getter 以完全匹配变量的名称,对于Repository 类也是如此,您的查询应该命名为findBymNumber .

标签: java spring hibernate spring-boot spring-data-jpa


【解决方案1】:

将 findBy 更改为以下内容:

public interface ToolRepository extends Repository<Tool, Long>
{
    public Tool findByMNumber(String mNumber);
}

如果更改参数名称,则需要使用@Param注解并指定属性名称。

参考: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-creation

如果不想更改方法名,请使用@Query 注解:

public interface ToolRepository extends Repository<Tool, Long>
{
    @Query("from Tool where mNumber = :number")
    public Tool findByNumber(String number);
}

如果需要,为 mNumber 生成 getter 和 setter。您可以通过 IDE 生成它。

【讨论】:

  • 对,我不想那样做。
  • 你的意思是你不想改成 findByMNumber ?
  • 我想写“findByNumber”,我想留下成员变量“mNumber”和列名“number”。这似乎是不可能的。
  • 谢谢,总理。这比我想要的更冗长(我更愿意在字段的注释中将其指定为单个名称属性),但这为我提供了一种方法。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
  • 2013-12-05
  • 2019-10-27
  • 1970-01-01
相关资源
最近更新 更多