如何在spring boot中使用hql只获取一条记录

Posted

技术标签:

【中文标题】如何在spring boot中使用hql只获取一条记录【英文标题】:How to get only one record using hql in spring boot 【发布时间】:2015-11-30 03:51:39 【问题描述】:

我正在使用带有 Spring Boot 的休眠模式。我想通过传递一个 id 从表中获取下一条和上一条记录。我在 hql 中编写了一个查询来从表中获取下一个和上一个记录。问题是我得到了所有以前和所有下一个记录,但我只想要一个前一个和一个最后一个记录。

这是我的 DAO 类,用于下一条记录

@Transactional
public interface DataDao extends CrudRepository<Data, Long> 

@Query(getDataId)
NextPrevData getDataId(Long post_id, Long data_id);

final String getDataId= "select new netgloo.models.NextPrevData(d.id) from Data d where d.postId=?1 and d.id>?2";


这里是 DAO 以前的记录

@Transactional
public interface PrevDao extends CrudRepository<Data, Long> 

@Query(getDataId)
NextPrevData getDataId(Long post_id, Long data_id);

final String getDataId= "select new netgloo.models.NextPrevData(d.id) from Data d where d.postId=?1 and d.id<?2";


这是我的控制器

@RequestMapping("/post_id/data_id")
@ResponseBody 
public Next getDataInfo(@PathVariable("post_id") long post_id,       @PathVariable("data_id") long data_id, HttpServletRequest req, HttpServletResponse res) throws ServletException 
NextPrevData Next = dataDao.getDataId(post_id, data_id);
NextPrevData Prev = prevDao.getDataId(post_id, data_id);
Post2 postobj = postDao2.findOne(post_id);
Data d = dataDao.findOne(data_id);
if(Next.isEquals(null))
postobj.setNextStatus(false);

else
postobj.setNextStatus(true);


if(Prev.isEmpty())
postobj.setPrevStatus(false);

else
postobj.setPrevStatus(true);


return new Next(Next,postobj,Prev,d);

这是我的下一课

public class Next 

private NextAndPrevious Next;
private NextAndPrevious Prev;
private Post2 post;
private Data d;

public Post2 getPost() 
    return post;


public void setPost(Post2 post) 
    this.post = post;


public Next(NextAndPrevious Next, Post2 postobj, NextAndPrevious Prev, Data d) 
    this.Next = Next;
    this.post = postobj;
    this.Prev = Prev;
    this.d = d;

//Getters and seters

【问题讨论】:

您需要从 hql 查询中返回一个列表,然后在您的控制器中获取第一条记录并将其发送到 Next 类。 你能编辑我的代码吗? 显示你的下一堂课; 好的..请检查我编辑的问题 【参考方案1】:

这是你的下一条记录的 DAO

@Transactional
public interface DataDao extends CrudRepository<Data, Long> 

@Query(getDataId)
List<NextPrevData> getDataId(Long post_id, Long data_id);

final String getDataId= "select new netgloo.models.NextPrevData(d.id) from Data d where d.postId=?1 and d.id>?2";


这是你以前记录的 DAO

@Transactional
public interface PrevDao extends CrudRepository<Data, Long> 

@Query(getDataId)
List<NextPrevData> getDataId(Long post_id, Long data_id);

final String getDataId= "select new netgloo.models.NextPrevData(d.id) from Data d where d.postId=?1 and d.id<?2";


你的控制器

RequestMapping("/post_id/data_id")
@ResponseBody 
public Next getDataInfo(@PathVariable("post_id") long post_id,  @PathVariable("data_id") long data_id, HttpServletRequest req, HttpServletResponse res) throws ServletException 



List<NextPrevData> Next = dataDao.getDataId(post_id, data_id);
List<NextPrevData> Prev = prevDao.getDataId(post_id, data_id);
Post2 postobj = postDao2.findOne(post_id);
Data d = dataDao.findOne(data_id);
long a=0;
long b=0;
if(Next.isEmpty())
postobj.setNextStatus(false);

else
postobj.setNextStatus(true);
a = Next.get(0).getDataId();


if(Prev.isEmpty())
postobj.setPrevStatus(false);

else
postobj.setPrevStatus(true);
b = Prev.get(0).getDataId();


return new Next(a,postobj,b,d);

这是你的下一堂课

public class Next 

private long Next;
private long Prev;
private Post2 post;
private Data d;

public Post2 getPost() 
    return post;


public void setPost(Post2 post) 
    this.post = post;


public Next(long Next, Post2 postobj, long Prev, Data d) 
    this.Next = Next;
    this.post = postobj;
    this.Prev = Prev;
    this.d = d;

//Getters and setters

【讨论】:

以上是关于如何在spring boot中使用hql只获取一条记录的主要内容,如果未能解决你的问题,请参考以下文章

如何配置 IntelliJ HQL 控制台以使用 Spring Boot

如何在spring sts中获取spring boot web项目的默认结构?

如何在 Spring Boot 中验证 JSON 请求?

如何获取spring boot application.yml里面的值

Spring Boot 中使用 Spring Task 实现定时任务

Spring Boot 中使用 Spring Task 实现定时任务