java - Hibernate 限制/标准初学者问题

标签 java hibernate criteria

您好,今天我一直在努力找出最好的方法,但没有成功。

理想情况下,我想做的是创建一个由下面的 SQL 公式计算的别名距离(尽管我对其他计算距离的方法持开放态度,但这似乎是最简单的方法)

一旦有了该别名,我希望能够以限制方式使用它来查找特定距离内的所有内容。

我还希望能够根据距离进行排序。

这是建立起来的更大搜索条件的一部分,因此我希望继续使用 Criteria。 (我已经限制了 Lat 和 Long 值的范围,以便在更少的字段上进行所需的距离计算。

Criteria criteria = session.createCriteria(Activity.class)
       .createAlias("activityLocations", "actloc")
       .createAlias("actloc.location", "location")
       .createAlias("location.address", "addr");
       criteria.add((Restrictions.and(Restrictions.between("addr.latitude", latmin,     
       latmax),Restrictions.between("addr.longitude", truelongmin, truelongmax))));


       String sql =  "SQRT( POW( 69.1 * ( addr3_.latitude - " + point[1]     
       +" ) , 2 ) + POW( 69.1 * ( "+point[0] +" - addr3_.longitude ) * COS( addr3_.latitude /"
       +" 57.3 ) , 2 ) )  < "+distance;    
       criteria.add(Restrictions.sqlRestriction(sql));

目前我在 sql 查询中有 addr3_,因为我正在查看详细的输出,这就是 Hibernate 生成查询的方式(这个 hack 在我正在查看的一个实例中有效,但我害怕考虑更长的时间术语含义所以不希望它留在那里!!)

最佳答案

在 SQL 限制中,您可以将条件根的别名称为 {alias}。要在这种情况下使用它,您需要一个以 location.address 为根的“子标准”:

Criteria criteria = session.createCriteria(Activity.class) 
       .createAlias("activityLocations", "actloc") 
       .createAlias("actloc.location", "location");

Criteria addr = criteria.createCriteria("location.address"); 
addr.add((Restrictions.and(Restrictions.between("latitude", latmin,      
       latmax), Restrictions.between("longitude", truelongmin, truelongmax)))); 

String sql =  "SQRT( POW( 69.1 * ( {alias}.latitude - " + point[1]      
       +" ) , 2 ) + POW( 69.1 * ( "+point[0] +" - {alias}.longitude ) * COS( {alias}.latitude /" 
       +" 57.3 ) , 2 ) )  < "+distance;     
addr.add(Restrictions.sqlRestriction(sql)); 

关于java - Hibernate 限制/标准初学者问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4136321/

相关文章:

java - 如何比较多个目标的变量值

java - 当TextField失去焦点时如何触发ChangeListener? JAVAFX

java - Dagger 没有初始化 Lazy<T> 惰性变量?

Hibernate Criteria 连接两个表

Hibernate Criteria contains-in 与表的关联

java - Java 中的 Flush PGP 加密 Bouncy CaSTLe 输出流

java - blob sql 类型的 Hibernate 验证问题

java - org.apache.openjpa.persistence.InvalidStateException : This broker is not configured to use managed transactions

java - EntityManager JNDI 查找

java - JPA creteria 查询中的 NullPointerException(在 where 子句上带有过滤条件)