Java 如何在Hibernate条件查询中使用MySQL函数

Java 如何在Hibernate条件查询中使用MySQL函数,java,hibernate,Java,Hibernate,我正在编写一个JAVA后台工作,每天午夜运行,检查数据库中明天将过生日的所有人,并向他们发送一封自动问候电子邮件 我知道如何编写本机查询,但很难在Hibernate条件查询中编写。 因此,我需要将本机MySQL查询转换为等效的JPA条件查询 SimpleDateFormat birthdayFormatter = new SimpleDateFormat("MMdd"); String birthDay = birthdayFormatter.format(tomorrow); 本机查询:选

我正在编写一个JAVA后台工作,每天午夜运行,检查数据库中明天将过生日的所有人,并向他们发送一封自动问候电子邮件

我知道如何编写本机查询,但很难在Hibernate条件查询中编写。 因此,我需要将本机MySQL查询转换为等效的JPA条件查询

SimpleDateFormat birthdayFormatter = new SimpleDateFormat("MMdd");
String birthDay = birthdayFormatter.format(tomorrow); 
本机查询:选择*来自日期格式(生日,%m%d')=生日的人

在Hibernate标准中,我有:

Criteria criteria = createCriteria();
criteria.add(Restrictions.eq("DATE_FORMAT(birthday, '%m%d')", birthDay));
那不行。我还尝试了:
Restrictions.sqlRestriction(“日期格式(生日,%m%d')=”“+birth+””)


那也不行。。谢谢你的建议

检查下面的代码,如何根据您的要求编写
Creteria查询

        @PersistenceContext
        EntityManager em; 

        CriteriaBuilder cb=em.getCriteriaBuilder();
        //select * from person  
        CriteriaQuery<person> qry =cb.createQuery(person.class);
        Root root = qry.from(person.class);  

        // WHERE DATE_FORMAT(birthday, '%m%d') = birthDay  
        Predicate predicate = cb.like(root.get("DATE_FORMAT"), "%"+birthday+"%");  
qry.where(predicate);

TypedQuery<person> tq = em.createQuery(qry);  
return tq.getResultList();
@PersistenceContext
实体管理器;
CriteriaBuilder cb=em.getCriteriaBuilder();
//从个人中选择*
CriteriaQuery qry=cb.createQuery(person.class);
Root Root=qry.from(person.class);
//其中日期格式(生日,%m%d')=生日
谓词=cb.like(root.get(“DATE\u格式”),“%”“+”生日+“%”;
qry.where(谓词);
TypedQuery tq=em.createQuery(qry);
返回tq.getResultList();

检查下面的代码,如何根据您的要求编写
Creteria查询

        @PersistenceContext
        EntityManager em; 

        CriteriaBuilder cb=em.getCriteriaBuilder();
        //select * from person  
        CriteriaQuery<person> qry =cb.createQuery(person.class);
        Root root = qry.from(person.class);  

        // WHERE DATE_FORMAT(birthday, '%m%d') = birthDay  
        Predicate predicate = cb.like(root.get("DATE_FORMAT"), "%"+birthday+"%");  
qry.where(predicate);

TypedQuery<person> tq = em.createQuery(qry);  
return tq.getResultList();
@PersistenceContext
实体管理器;
CriteriaBuilder cb=em.getCriteriaBuilder();
//从个人中选择*
CriteriaQuery qry=cb.createQuery(person.class);
Root Root=qry.from(person.class);
//其中日期格式(生日,%m%d')=生日
谓词=cb.like(root.get(“DATE\u格式”),“%”“+”生日+“%”;
qry.where(谓词);
TypedQuery tq=em.createQuery(qry);
返回tq.getResultList();

所以我终于从这个链接中找到了一种方法:

我需要像这样使用Restrictions.sqlRestriction():

criteria=createCriteria(); criteria.add(Restrictions.sqlRestriction(“DATE_格式({alias}.birth), “%m%d')=?,生日,StringType.INSTANCE))


真管用

所以我终于从这个链接中找到了一种方法:

我需要像这样使用Restrictions.sqlRestriction():

criteria=createCriteria(); criteria.add(Restrictions.sqlRestriction(“DATE_格式({alias}.birth), “%m%d')=?,生日,StringType.INSTANCE))


真管用

限制与JPA标准无关,也就是Hibernate标准,所以请决定使用什么。其次,您可以使用JPQL“函数”调用任何SQL函数(在JPA标准中也是如此)。当你这么做的时候会发生什么?很抱歉给你带来困惑,谢谢你指出。事实上,我使用的是Hibernate标准,所以我的问题应该是“如何在Hibernate标准查询中使用MySQL函数”。使用JPQL,我能够得到期望的结果。。我只是想知道如何在Hibernate中完成它。我意识到在JPA标准中,有一些东西类似于criteriaBuilder.function()。限制与JPA标准无关,即Hibernate标准,所以请决定您使用的是什么。其次,您可以使用JPQL“函数”调用任何SQL函数(在JPA标准中也是如此)。当你这么做的时候会发生什么?很抱歉给你带来困惑,谢谢你指出。事实上,我使用的是Hibernate标准,所以我的问题应该是“如何在Hibernate标准查询中使用MySQL函数”。使用JPQL,我能够得到期望的结果。。我只是想知道如何在Hibernate中完成它。我意识到在JPA标准中,有一些东西类似于criteriaBuilder.function()。谢谢!!我想你的exmaple会有用的。我只是固执地想知道,如果不使用Criteria builder,在Hibernate Criteria查询中会是什么样子。。我终于从这个链接中找到了一种方法:我需要像这样使用Restrictions.sqlRestriction():criteria criteria=createCriteria();条件..添加(Restrictions.sqlRestriction(“DATE_格式({alias}.birth,'%m%d')=?”,birth,StringType.INSTANCE));真管用!!你应该把你的评论写进一个答案@Lin,这样我也可以投上一票!谢谢你,阿奇!!我想你的exmaple会有用的。我只是固执地想知道,如果不使用Criteria builder,在Hibernate Criteria查询中会是什么样子。。我终于从这个链接中找到了一种方法:我需要像这样使用Restrictions.sqlRestriction():criteria criteria=createCriteria();条件..添加(Restrictions.sqlRestriction(“DATE_格式({alias}.birth,'%m%d')=?”,birth,StringType.INSTANCE));真管用!!你应该把你的评论写进一个答案@Lin,这样我也可以投上一票!我认为你可以在24小时后接受你自己的答案,或者你可以接受arch的答案,如果它真的帮助了你。我认为你可以在24小时后接受你自己的答案,或者你可以接受arch的答案,如果它真的帮助了你。