在我的情况下,如何编写自定义 CrudRepository 方法(@Query)来过滤结果

Posted

技术标签:

【中文标题】在我的情况下,如何编写自定义 CrudRepository 方法(@Query)来过滤结果【英文标题】:How to write a custom CrudRepository method(@Query) to filter the result in my case 【发布时间】:2015-09-06 14:54:03 【问题描述】:

我是 Spring JPA 和 Repository 的新手。我有一个包含一堆字段的 Auction 类,其中一个字段是类别。我想要 CrudRepository 中的自定义方法来按 Category.name 过滤结果;

@XmlRootElement 
@Entity(name="AUCTION")
public class Auction implements Serializable

    private static final long serialVersionUID = 1L;

    @Id
    String id;

    @Column
    @Size(min=5, max=200)
    String title;

    String description;

    @OneToOne(cascade=CascadeType.ALL)
    Category category;

    ....

类别

@Entity(name="CATEGORY")
//@NamedQuery(name="Category.findByName", query="select c from Category c where c.name=:name")
public class Category implements Serializable

    private static final long serialVersionUID = 3L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;

    private String name;

    public Category()
    

    

在拍卖存储库中,我添加了这样的方法

@Repository
public interface AuctionRepository extends CrudRepository<Auction, String>

    @Query("from Auction a join a.category c where c.name=:categoryName")
    public Iterable<Auction> findByCategory(String categoryName);


它抛出一个错误。省略此方法,一切正常。有人告诉我,这种类型的自定义方法可以在 CrudRepository 中声明,Spring 会使用我们提供的 methodName 和查询提示来处理正确的事情。请有人指出我正确的方向。

【问题讨论】:

【参考方案1】:

您需要在方法变量名称中添加@Param 注释,以便您可以在查询中引用它。你写的代码绝对没问题。如果您需要访问EntityManager,那么您将需要一个自定义存储库。

@Query("from Auction a join a.category c where c.name=:categoryName")
public Iterable<Auction> findByCategory(@Param("categoryName") String categoryName);

@Param 在使用 Java 8 并使用 -parameters 编译时可以省略。

希望对您有所帮助。

提示:每当您发布问题时,请务必同时发布异常详细信息。它有助于理解问题。

【讨论】:

是不是说,我需要在Repository Implementation 类中手动实现方法? 不,你很好。唯一缺少的部分是@Param("categoryName")。结帐docs.spring.io/spring-data/jpa/docs/1.8.0.RELEASE/reference/… 感谢您的帮助,但我想我还缺少其他东西。它抛出以下异常。 org.springframework.beans.factory.BeanCreationException:创建名为“auctionServiceImpl”的bean时出错:注入自动装配依赖项失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:com.mum.waa.project.repository.AuctionRepository com.mum.waa.project.service.AuctionServiceImpl.auctionRepository;嵌套异常是 org.springframework。 堆栈跟踪被截断。在您的问题本身中添加堆栈跟踪。 感谢@OliverGierke 的提示。更新了答案。

以上是关于在我的情况下,如何编写自定义 CrudRepository 方法(@Query)来过滤结果的主要内容,如果未能解决你的问题,请参考以下文章

使用 Qt GUI 编写 c++ dll,在自定义小部件中显示失败

如何在没有邮件接收客户端的情况下验证 Mandrill 自定义发送域?

jQuery-UI 在没有 CSS 或自定义的情况下无法在我的用户脚本中工作?

在我的情况下,如何在 Oracle 中编写 SQL?

如何在不知道数据库总行数的情况下执行自定义分页

如何在没有第三方库的情况下创建自定义幻灯片菜单。?