Java JPQL验证错误

Java JPQL验证错误,java,spring,hibernate,jpa,spring-data-jpa,Java,Spring,Hibernate,Jpa,Spring Data Jpa,如果我没有编写自定义查询,@AutowiredFirstnameRepository对象是null,因此我尝试编写自定义查询,但这会产生以下错误 java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List FirstnameRepository.findByNation(Nation)! 由于查询在我看来是正确的,我认为它与我的类结构或不正确的

如果我没有编写自定义查询,
@Autowired
FirstnameRepository
对象是
null
,因此我尝试编写自定义查询,但这会产生以下错误

java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List FirstnameRepository.findByNation(Nation)!
由于查询在我看来是正确的,我认为它与我的类结构或不正确的注释有关

FirstnameRepo

 public interface FirstnameRepository extends JpaRepository<Firstname, String>{

    @Query("SELECT fn FROM Firstname fn WHERE fn.nation = :nation")
    List<Firstname> findByNation(@Param("nation")Nation nation);
}
由于还有一个
Lastname
模型类,我扩展了一个名为
Name
的类,将
Firstname
Lastname
保存在同一个
映射中
Name
在数据库中没有表,两个类都只继承ID属性

名称类

@MappedSuperclass
public abstract class Name {
    @Id
    @Basic(optional = false)
    @Column(name = "name")
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
如果我注释掉
findByNation()
方法,那么服务器启动时不会出现问题。我希望这就是您所需要的一切,服务器配置或多或少是从一个正在工作的项目复制的,但是如果我应该包括一些东西,请让我知道。谢谢

编辑
问题是配置不正确。在再次测试之前,我更改了很多内容,但主要问题似乎是web.xml中的错误版本。

您的查询格式不正确。。。你不能把这个“
fn.nation=:nation
”放在nation是一个实体的地方,你应该使用表之间的连接来正常工作


我建议您这样做。

尽管这个问题很可能与查询本身有关,但在我的例子中是一个配置问题。这是我检查过的一些东西

  • web.xml中的版本,指定所用Servlet规范的版本-
  • 确保已加载数据库上下文(例如db context.xml)

应该是
从名字中选择fn,其中fn.nation在:nation
中,即
中收集运算符它是一个名字中的特定国家,它是关系的“一方”,因此我不这么认为。但我会试试看。=>同样的错误。这可能对您的问题没有帮助,但名称类不应该也是可序列化的吗?我考虑过这一点,但我在Netbeans中生成了一些模型类,它创建了如下查询“从名字f中选择f,其中f.nation.region=:region”。在这种情况下,地区也是一个实体,国家也没有加入。但我会尝试加入。@KenavR让我知道,如果效果不好,我会尝试用另一种方式帮助你。没有区别。我尝试了Objectcomparison和Id comparison,我想错误与查询本身无关。我将再次检查我的配置。@KenavR请看,或多或少都是相同的错误。但无论如何,请检查您的配置。这确实是一个配置问题,我的web.xml有错误,我还更改了一些其他内容。
@MappedSuperclass
public abstract class Name {
    @Id
    @Basic(optional = false)
    @Column(name = "name")
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}