如何使用Hibernate从数据库加载必要的数据?

时间:2014-10-11 10:01:52

标签: java database hibernate filtering criteria

我有以下课程:

@Entity
@Table(name = "terminal")
public class Terminal {

    @Column(name = "map_lat")
    private Double mapLat; 

    @Column(name = "map_lng")
    private Double mapLng;

    //get and set methods

}

我在数据库中分别对应表格。

我想写dao方法,它将返回所有将在传递的半径和中心内定位的终端。我知道我可以加载所有对象并在java代码中过滤它们,但我想只加载必要的对象。可能吗?我有方法检查cicrcle里面的那个点。

我当前的dao方法:

@Override
    public List<Terminal> findInsideCircleActive(double centerLatitude, double centerLongitude, double radius) {
       List<Terminal> allTerminals = findAllActive() ;
       List<Terminal> filteredTerminals = new ArrayList<>();
       for(Terminal terminal: allTerminals){
           if(distFrom(terminal.getMapLat(),terminal.getMapLng(),centerLatitude,centerLongitude) <= radius ){
                filteredTerminals.add(terminal);
           }
       }
        return filteredTerminals;
    }

dist方法实现:

private static float distFrom(double lat1, double lng1, double lat2, double lng2) {
        double earthRadius = 6371; //kilometers
        double dLat = Math.toRadians(lat2-lat1);
        double dLng = Math.toRadians(lng2-lng1);
        double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
                Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
                        Math.sin(dLng/2) * Math.sin(dLng/2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
        float dist = (float) (earthRadius * c);

        return dist;
    }

数据库shema:

enter image description here

1 个答案:

答案 0 :(得分:0)

这可以通过将标准应用于查询并使用findByCriteria()而不是list()

来完成。

从我的一个项目中查看这个DAO函数:

@Override
public List<Project> listByOwner(User owner) {
    DetachedCriteria c = DetachedCriteria crit = DetachedCriteria.forClass(Projects.class);
    c.add(Restrictions.eq("deleted", false));
    c.add(Restrictions.eq("owner", owner));
    c.addOrder(Order.desc("dateEdit"));
    return new HibernateTemplate(sessionFactory).findByCriteria(c);
}

如果您的问题与编写查询无关,而是与您特别想要过滤经度和纬度相关,那么请给Hibernate-Spatail一个机会。是专门为此而构建的:http://www.hibernatespatial.org