2016-06-10 179 views
0

我已经实现了我的自定义CRUD存储库,它添加了一些额外的功能,比如在某日期之后获取第一张下一张图片(我正在使用它在其他图片后查找下一张图片)。但由于某种原因,它不会返回我期望的结果。有时返回的图片与搜索时使用的相同(此图片的日期)。我100%确定,我的所有照片都有独特的日期创建。JPA查询返回错误结果

任何人都知道我的代码有什么问题?

public class PictureRepositoryImpl implements CustomPictureRepository { 

@PersistenceContext 
private EntityManager em; 

@Override 
public Picture next(Date date) { 

    TypedQuery<Picture> q = em.createQuery("select p from Picture p where p.dateCreated > :date order by p.dateCreated asc", Picture.class); 
    q.setParameter("date",date, TemporalType.DATE); 
    Picture picture = q.setFirstResult(0) 
      .setMaxResults(1) 
      .getSingleResult(); 


    if(picture == null) 
    { 
     return null; 
    } 

    LoggerFactory.getLogger(DemoApplication.class).info("Fetched nextpicture: " + picture.getId() + ")"); 

    return picture; 
} 
} 

enter image description here

更新: 我期待得到“2016年3月20日”后的第一个画面,而不是它,我得到了相同的画面。

+0

“它不会返回我期望的结果” - 如果您发布了您期望的_what_和您得到的结果,它将有所帮助。 – Thomas

+0

我确定它会返回适合于被调用的SQL的图片。并且调用的SQL是什么? –

+2

我不确定,因为我们通常不使用它,但AFAIK'TemporalType.DATE'可能会导致日期被截断为日精度(或至少高于毫秒精度)。因此,如果在同一天创建了2张图片(或者至少非常接近彼此),您将获得之前创建的图片,这可能是您正在寻找继承者的图片。改为尝试'TemporalType.TIMESTAMP'。 – Thomas

回答

0

我已经解决了这个问题,看来主要问题是没有使用Timestamp,请看下面的代码。

TypedQuery<Picture> q = em.createQuery("select p from Picture p where p.dateCreated < :date order by p.dateCreated desc", Picture.class); 
    q.setParameter("date", date, TemporalType.TIMESTAMP); 

    List<Picture> pictures = q 
      .setMaxResults(1) 
      .getResultList();