我是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和我们提供的查询提示来完成正确的事情。有人能指出我正确的方向吗。
您需要@Param在方法变量名称中添加注释,以便可以在查询中引用它。您编写的代码绝对可以。如果您需要访问EntityManager,则需要一个自定义存储库。
@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。
-parameters
希望能有所帮助。
提示:每当您发布问题时,也要同时发布异常详细信息。它有助于理解问题。