【问题标题】:How to use MySQL functions in Hibernate Criteria Query如何在 Hibernate Criteria Query 中使用 MySQL 函数
【发布时间】:2015-11-18 23:55:26
【问题描述】:

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

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

SimpleDateFormat birthdayFormatter = new SimpleDateFormat("MMdd");
String birthDay = birthdayFormatter.format(tomorrow); 

原生查询:select * from person WHERE DATE_FORMAT(birthday, '%m%d') =birthDay;

在休眠标准中我有:

Criteria criteria = createCriteria();
criteria.add(Restrictions.eq("DATE_FORMAT(birthday, '%m%d')", birthDay));

那行不通。我也试过:Restrictions.sqlRestriction("DATE_FORMAT(birthday, '%m%d') = '" + birthDay + "'");

这也行不通..感谢任何建议..

【问题讨论】:

  • Restrictions 与 JPA Criteria 无关,即 Hibernate Criteria 所以决定你使用什么。其次,您可以使用 JPQL“函数”调用任何 SQL 函数(在 JPA 标准中也是如此)。当你这样做时会发生什么?
  • 很抱歉造成混乱,感谢您的指出。事实上,我正在使用 Hibernate Criteria,所以我的问题应该是“如何在 Hibernate Criteria Query 中使用 MySQL 函数”。使用 JPQL,我能够得到想要的结果。我只是想知道如何在 Hibernate 中做到这一点。我意识到在 JPA Criteria 中,有类似 criteriaBuilder.function() 的东西。

标签: java hibernate


【解决方案1】:

所以我终于从这个链接中找到了一种方法:stackoverflow.com/questions/2345419/

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

标准条件 = createCriteria(); criteria.add(Restrictions.sqlRestriction("DATE_FORMAT({alias}.birthday, '%m%d') = ?",birthDay, StringType.INSTANCE));

这行得通!

【讨论】:

  • 我认为你可以在 24 小时后接受你自己的答案,或者如果它真的对你有帮助,你可以接受拱门的答案。
【解决方案2】:

查看下面的代码,Creteria Query的写法根据你的要求:

        @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();

【讨论】:

  • 感谢拱门!!我认为你的例子会起作用。我只是很想知道在不使用标准生成器的情况下它在 Hibernate Criteria Query 中的表现如何。我终于从这个链接中找到了一种方法:stackoverflow.com/questions/2345419/… 我需要像这样使用 Restrictions.sqlRestriction():标准标准 =创建标准(); criteria..add(Restrictions.sqlRestriction("DATE_FORMAT({alias}.birthday, '%m%d') = ?",birthDay, StringType.INSTANCE));那行得通!
  • 你应该把你的评论放到@Lin的答案中,这样我也可以投票!
猜你喜欢
  • 2019-09-12
  • 2013-05-27
  • 1970-01-01
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 2014-10-03
  • 2017-07-17
相关资源
最近更新 更多