Hibernate Criteria for Dates

前端 未结 4 454
南方客
南方客 2020-11-30 04:54

In oracle I have dates in format

17-April-2011 19:20:23.707000000

I would like to retrieve all orders for 17-04-2011.

 SimpleDateFormat form         


        
相关标签:
4条回答
  • 2020-11-30 05:22

    Why do you use Restrictions.like(...)?

    You should use Restrictions.eq(...).

    Note you can also use .le, .lt, .ge, .gt on date objects as comparison operators. LIKE operator is not appropriate for this case since LIKE is useful when you want to match results according to partial content of a column. Please see http://www.sql-tutorial.net/SQL-LIKE.asp for the reference.

    For example if you have a name column with some people's full name, you can do where name like 'robert %' so that you will return all entries with name starting with 'robert ' (% can replace any character).

    In your case you know the full content of the date you're trying to match so you shouldn't use LIKE but equality. I guess Hibernate doesn't give you any exception in this case, but anyway you will probably have the same problem with the Restrictions.eq(...).

    Your date object you got with the code:

    SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY");
    String myDate = "17-04-2011";
    Date date = formatter.parse(myDate);
    

    This date object is equals to the 17-04-2011 at 0h, 0 minutes, 0 seconds and 0 nanoseconds.

    This means that your entries in database must have exactly that date. What i mean is that if your database entry has a date "17-April-2011 19:20:23.707000000", then it won't be retrieved because you just ask for that date: "17-April-2011 00:00:00.0000000000".

    If you want to retrieve all entries of your database from a given day, you will have to use the following code:

        SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY");
        String myDate = "17-04-2011";
        // Create date 17-04-2011 - 00h00
        Date minDate = formatter.parse(myDate);
        // Create date 18-04-2011 - 00h00 
        // -> We take the 1st date and add it 1 day in millisecond thanks to a useful and not so known class
        Date maxDate = new Date(minDate.getTime() + TimeUnit.DAYS.toMillis(1));
        Conjunction and = Restrictions.conjunction();
        // The order date must be >= 17-04-2011 - 00h00
        and.add( Restrictions.ge("orderDate", minDate) );
        // And the order date must be < 18-04-2011 - 00h00
        and.add( Restrictions.lt("orderDate", maxDate) ); 
    
    0 讨论(0)
  • 2020-11-30 05:22

    If the column is a timestamp you can do the following:

            if(fromDate!=null){
                criteria.add(Restrictions.sqlRestriction("TRUNC(COLUMN) >= TO_DATE('" + dataFrom + "','dd/mm/yyyy')"));
            }
            if(toDate!=null){               
                criteria.add(Restrictions.sqlRestriction("TRUNC(COLUMN) <= TO_DATE('" + dataTo + "','dd/mm/yyyy')"));
            }
    
            resultDB = criteria.list();
    
    0 讨论(0)
  • 2020-11-30 05:26

    try this,

        String dateStr = "17-April-2011 19:20:23.707000000 ";
        Date dateForm = new SimpleDateFormat("dd-MMMM-yyyy HH:mm:ss").parse(dateStr);
        SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");  
    
        String newDate = format.format(dateForm);  
    
        Calendar today = Calendar.getInstance();
        Date fromDate = format.parse(newDate);
        today.setTime(fromDate);
        today.add(Calendar.DAY_OF_YEAR, 1);
        Date toDate= new SimpleDateFormat("dd-MM-yyyy").parse(format.format(today.getTime()));
    
        Criteria crit = sessionFactory.getCurrentSession().createCriteria(Model.class);
        crit.add(Restrictions.ge("dateFieldName", fromDate));
        crit.add(Restrictions.le("dateFieldName", toDate));
        return crit.list();
    
    0 讨论(0)
  • 2020-11-30 05:38

    By using this way you can get the list of selected records.

    GregorianCalendar gregorianCalendar = new GregorianCalendar();
    Criteria cri = session.createCriteria(ProjectActivities.class);
    cri.add(Restrictions.ge("EffectiveFrom", gregorianCalendar.getTime()));
    List list = cri.list();
    

    All the Records will be generated into list which are greater than or equal to '08-Oct-2012' or else pass the date of user acceptance date at 2nd parameter of Restrictions (gregorianCalendar.getTime()) of criteria to get the records.

    0 讨论(0)
提交回复
热议问题