JPA查询创建顺序依据

时间:2013-12-04 11:42:29

标签: java spring jpa

我正在尝试自己学习Spring,我打算通过创建一个博客网络应用程序来实现。我已经有了基本的博客功能,这是一个显示博客帖子的页面,以及一个提交表单的页面。显示博客帖子的页面显示了最新的博客文章,以及数据库中所有博客帖子的标题列表。

要从数据库中获取博客文章的有序列表,我首先在我的Repository界面中创建了一个sql查询。这工作,但现在我想使用的功能,我可以在界面中键入方法名称,而不是硬编码的SQL。我在这里找到了支持的关键字:http://docs.spring.io/spring-data/jpa/docs/1.4.2.RELEASE/reference/html/jpa.repositories.html#jpa.query-methods.query-creation,并尝试实施它。

所以用我的方法findAllOrderByIdDesc()我试图实现与我的SQL查询相同的东西。我不确定为什么它不起作用,我认为我正确使用了关键词?

stackstrace(我不完全理解):
    引起:org.springframework.data.mapping.PropertyReferenceException:找不到类型为int的属性desc         在org.springframework.data.mapping.PropertyPath。(PropertyPath.java:75)         在org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:327)         在org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:307)         在org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:330)         在org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:353)         在org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:307)         在org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:271)         在org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:245)         在org.springframework.data.repository.query.parser.Part。(Part.java:72)         在org.springframework.data.repository.query.parser.PartTree $ OrPart。(PartTree.java:188)         在org.springframework.data.repository.query.parser.PartTree $ Predicate.buildTree(PartTree.java:277)         在org.springframework.data.repository.query.parser.PartTree $ Predicate。(PartTree.java:257)         在org.springframework.data.repository.query.parser.PartTree。(PartTree.java:71)         在org.springframework.data.jpa.repository.query.PartTreeJpaQuery。(PartTreeJpaQuery.java:57)         在org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy $ CreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:90)         在org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy $ CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:162)         在org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy $ AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:68)         在org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor。(RepositoryFactorySupport.java:290)         在org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:158)         在org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:162)         在org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:44)         在org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:144)         ......还有32个

我的存储库界面:

public interface PostRepository extends CrudRepository<Post, Integer> {

@Query("select p from Post p order by p.id desc")
Iterable<Post> findLastFirst();

Iterable<Post> findAllOrderByIdDesc();

}

我的帖子实体:

@Entity
public class Post {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private Date date;
private String title;
@Lob
private String body;

protected Post() {
    date = new Date();
}

public Post(String title, String body) {
    this.date = new Date();
    this.title = title;
    this.body = body;
}

public int getId() {
    return id;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public Date getDate() {
    return date;
}

public String getBody() {
    return body;
}

public void setBody(String body) {
    this.body = body;
}

4 个答案:

答案 0 :(得分:84)

我知道这有点晚了,但这可能有助于其他人。

只需将Lazy放在BY之前,就像这样:ORDER

它应该有用。

答案 1 :(得分:11)

CrudRepository有一个名为PagingAndSortingRepository

的扩展名
 public interface PostRepository extends PagingAndSortingRepository<Post, Integer> {}

然后只需调用.findAll(new Sort(Sort.Direction.DESC,“id”));而不是findAllOrderByIdDesc();

答案 2 :(得分:4)

我知道我在游戏中有点迟了但是......

另一个解决方法是更正存储库中命名查询的语法。

你有:Iterable<Post> findAllOrderByIdDesc();

应该是:Page<Post> findAllByOrderByIdDesc();

请注意By之后添加findAll关键字。这标志着过滤语句的开始。

答案 3 :(得分:0)

可能我的答案很愚蠢,但你只是尝试"from Post order by id desc"而不是"select p from Post p order by p.id desc"