一尘不染

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

hibernate

我是Spring
JPA和Repository的新手。我有一个拍卖类,其中有一堆字段,其中一个字段是类别。我想要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和我们提供的查询提示来完成正确的事情。有人能指出我正确的方向吗。


阅读 906

收藏
2020-06-20

共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

希望能有所帮助。

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

2020-06-20