在我们的Spring Data JpaRepository接口中,到处都出现“无效的派生查询”错误(在STS 3.1中)。

24

我们已经按照Spring Data文档所示完全实现了我们的代码库。一切都很顺利,直到我们从STS 2.9升级到STS 3.1。所有试图消除这些错误的尝试都失败了,在某些情况下它们甚至没有意义! 它们与接口或实体中使用的任何属性都不匹配!

以下是一个例子:

public interface CreditNotesRepository extends JpaRepository<CreditNotes, Long> {

    CreditNotes findCurrentCreditNotes(Long shipmentDetailId);
}

findCurrentCreditNotes 是我们实体中的一个命名查询。这段代码完全可以正常执行。

@NamedQueries({
    @NamedQuery(name = "CreditNotes.getCount", query = "SELECT COUNT(f) FROM CreditNotes f"),
    @NamedQuery(name = "CreditNotes.findCurrentCreditNotes", query =
        "SELECT creditNotes FROM CreditNotes creditNotes"
        + " WHERE creditNotes.shipmentDetail.shipmentDetailId = ?1 "
        + " AND creditNotes.notesSeqNumber =  (SELECT max(creditNotes2.notesSeqNumber) FROM CreditNotes creditNotes2"
        + " WHERE creditNotes.shipmentDetail.shipmentDetailId = creditNotes2.shipmentDetail.shipmentDetailId)")
})

我们得到的错误信息如下:

Invalid derived query! No property find found for type ca.cole.freight.model.CreditNotes
虽然这只是一个标记(不影响编译),但它很烦人且令人困惑。有谁能为此提供一些解释?并像我六岁一样给我解释一下!;)

虽然这只是一个标记(不影响编译),但它很烦人且令人困惑。有谁能为此提供一些解释?并像我六岁一样给我解释一下!;)

4个回答

34
在Spring论坛的post上,Spring团队宣布已经修复了这个问题,适用于STS 3.3.0版本。我还没有检查过这个版本。但是我正在使用3.5.0.RELEASE,并且这个问题又出现了!我的解决方法是取消选中“无效派生查询”。

Invalid Derived Query


3
同样出现在STS 3.6.3.RELEASE版本中。 - Gernot
4
这个问题在 STS 3.9.1 中仍然存在。 - kri
1
问题仍然存在于3.9.4版本中。 - Ouissal
1
它仍然在3.9.5版本。 - Anand
仍然是在3.9.8版本。 - David Vicente

26

15

这个问题也有解决方法。在您的存储库中,如果未定义JPQL / SQL查询,请在方法定义上添加@Query注释。

这是一个例子:

@Query
List<OwnerModel> findByFirstNameAndAgeNotZero(@Param(value = "firstName") String firstName);
在这种情况下,将使用名为查询 OrderModel.findByFirstNameAndAgeNotZero。您的Eclipse错误 Invalid derived query 也应该消失,无需像@Tuan Dang所描述的那样禁用验证。 在已安装Spring插件的Eclipse 4.5.1上检查了@NamedQuery@NamedNativeQuery

Pawel Deleba,java.lang.IllegalArgumentException:查询源字符串不能为空。您的解决方案将无法工作。 - Arun nagar

0

我刚刚自己研究了这个问题。不幸的是,Spring Data在1.1和1.2之间的实现发生了变化。它不再支持<repository> XML声明。你可以设置一个自定义后缀,但默认情况下,它期望一个类名为<InterfaceName>Impl的bean。如果找不到自定义存储库实现,你就会开始遇到像你遇到的那样的错误。它试图创建基于接口中方法名称的对象查询方法。

另一种选择是将Spring Data版本降级到1.1,并在你的XML中指定http://www.springframework.org/schema/data/jpa/spring-jpa-1.1.xsd的schemalocation。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接