Java 如何仅使用JPA(或Hibernate)API使此查询工作?

Java 如何仅使用JPA(或Hibernate)API使此查询工作?,java,hibernate,jpa,Java,Hibernate,Jpa,我的代码中有以下方法: public boolean isFooHere(final Foo foo) { final Query query = getCurrentSession().createQuery("SELECT COUNT(*) FROM FooBar WHERE foo_id = " + foo.getId()); final long count = (Long) query.uniqueResult(); if (count == 0) {

我的代码中有以下方法:

public boolean isFooHere(final Foo foo) {
    final Query query = getCurrentSession().createQuery("SELECT COUNT(*) FROM FooBar WHERE foo_id = " + foo.getId());
    final long count = (Long) query.uniqueResult();
    if (count == 0) {
        return false;
    } else {
        return true;
    }
}
但我认为使用硬编码的SQL查询并不是一种好的做法


如何仅使用JPA API就可以拥有相同的功能?

类似的内容。在查询和实体字段中使用类而不是表名,而不是列

Query query = getCurrentSession().createQuery(
        "select count(*) from Foo f where f.id=:id");
query.setLong("id", foo.getId());
Long count = (Long)query.uniqueResult();
我就是这样做的:

public boolean isFooHere(final Foo foo) {
    final Criteria criteria = getCurrentSession().createCriteria(FooBar.class);
    criteria.add(Restrictions.eq("foo", foo));
    criteria.setProjection(Projections.rowCount());
    final Long result = (Long) criteria.uniqueResult();
    return result > 0;
}
你可以用

比如,

public Boolean isFooHere(final Foo foo) {

   Criteria criteria = createCriteria();

   criteria.add(Restrictions.eq("foo.id", foo.getId()));

   if(criteria.uniqueResult() != null)
      return true;

   return false;
}

请注意,在“foo.id”中,foo是您的db表名。

这也容易受到SQL注入攻击。查看准备好的语句。@aryamcarthy我认为没有任何方法可以传递foo.id的自定义字符串。您可以在JPA中使用条件查询或NamedQuery。最佳实践是仅为sql查询创建一个类,并将它们作为静态变量保留。我更喜欢NamedQuery,因为查询在它们自己的实体类中,并且比其他方式可读性更好。这对于JPQL来说是微不足道的,所以不知道为什么您甚至考虑使用“Hibernate API”(并且失去可移植性)返回计数查询的类型可能会有所不同,因此,在转换查询结果时使用
java.lang.Number
,然后使用诸如intValue()和longValue()等方法转换查询结果将更加方便。