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()等方法转换查询结果将更加方便。