【问题标题】:How to load only necessary data from database using Hibernate?如何使用 Hibernate 从数据库中仅加载必要的数据?
【发布时间】:2014-12-06 10:49:07
【问题描述】:

我有以下课程:

@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 代码中过滤它们,但我只想加载必要的对象。可能吗?我有方法可以检查圆圈内的那个点。

我目前的道法:

@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:

【问题讨论】:

  • 你有没有为此写过任何查询?与我们分享,以便我们为您提供更多帮助。
  • @OO7 我更新了话题
  • 您需要将您的distFrom() 方法翻译成HQL 或SQL。
  • @JB Nizet 是的,你是对的,但我不知道怎么做。我添加了 dist 方法相关化
  • @gstackoverflow 您说,您希望所有终端都在通过的中心和半径内。数据库中有没有适合他们的字段?还是有一些特殊情况?

标签: java database hibernate filtering criteria


【解决方案1】:

这可以通过将条件应用于查询并使用 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

【讨论】:

    猜你喜欢
    • 2017-06-27
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多