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;
}
}