首页 > 解决方案 > 如何在时间戳属性的年份部分制定标准?

问题描述

@Entity
@Table(name = "demandefraismission")
public class DemandeFraisMission extends BaseModele {

   @Id
   @Column(name = "id")
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private int id;
   
   //  ...

   @Column(name = "datevalidation")
   private Timestamp datevalidation;

   //  ...
}
    
@Override
public List<DemandeFraisMission> listeDmdValidatedAnneeAvant(String site, String anneeAvantValidation) {
   List<DemandeFraisMission> retour = null;
   try {
      Session session = null;
      if (entityManager == null
          || (session = entityManager.unwrap(Session.class)) == null) {
                    throw new NullPointerException();
      }
      Criteria criteria = session.createCriteria(DemandeFraisMission.class, "i");
      criteria.add(Restrictions.eq("i.lieumission", site));
      criteria.add(Restrictions.like("i.datevalidation", anneeAvantValidation, MatchMode.START));
      criteria.add(Restrictions.eq("i.status", "Validée"));
      criteria.addOrder(Order.desc("id"));
      retour = criteria.list();
      System.out.println(retour);
   } catch (Exception ex) {
       ex.printStackTrace();
   }
   return retour;
}

如何在datevalidation属性上制定标准,但仅在时间戳值的年份部分上?

标签: hibernatehibernate-criteria

解决方案


尝试使用这样的东西:

import org.hibernate.type.IntegerType;

// ...
Integer expectedYear = 2020;

// ...
criteria.add(
   Restrictions.sqlRestriction(
      "EXTRACT(YEAR FROM datevalidation) = ?",
      expectedYear,
      IntegerType.INSTANCE
   )
)

请参阅休眠文档的这一部分

EXTRACT()函数是 MySQL、Oracle、PostgreSQL 和 Firebird 支持的 SQL 标准函数。如果您使用 SQL Server,您可以使用YEAR()orDATEPART()函数从日期中提取年份。


推荐阅读