【问题标题】:Hibernate entity virtual column error?Hibernate实体虚拟列错误?
【发布时间】:2015-10-28 00:47:57
【问题描述】:

我在我的Entity 中定义了一个虚拟列distanceInKm 用于一些距离计算并向用户提供响应以及distanceInKm 这是一个虚拟列而不是我的表中的列,它运行良好(案例1)

现在我使用同一个实体从表中获取所有值,但得到的是com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'restaurant0_.distanceInKm' in 'field list'(案例 2)

我知道@Transiant 注释用于计算的虚拟列的用法。但是如果使用该虚拟列,则在(案例1)中将不会序列化/添加到用户响应中。我需要使用一个实体同时实现API案例 1 和案例 2

 @Entity
    @Table(name = "restaurants")
    public class Restaurants implements Serializable {

        private static final long serialVersionUID = 1L;

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "restaurant_id")
        private int restaurantId;

        @Column(name = "restaurant_name")
        private String restaurantName;

        @Column(name = "category_id")
        private Integer categoryId;

        @Column(name = "image_url")
        private String imageUrl;

        private Float longitude;

        private Float latitude;

        @Column(name = "contact_name")
        private String contactName;

        @Column(name = "primary_phone")
        private String primaryPhone;

        @Column(name = "secondary_phone")
        private String secondaryPhone;

        private String fax;

        private String address1;

        private String address2;

        /*  Virtual column   */
        @Column(insertable = false, updatable = false)
        private String distanceInKm;

}

感谢您的帮助。

我的距离比较查询,

SELECT restaurant_id,restaurant_name,
category_id,image_url,longitude,latitude,
contact_name,primary_phone,secondary_phone,
fax,address1,address2,
((ACOS(SIN(:lat * PI() / 180) * SIN(latitude * PI() / 180) + COS(:lat * PI() / 180) * COS(latitude * PI() / 180) * COS((:lon-longitude) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) 
AS `distanceInKm` FROM 
`restaurants` HAVING 
`distanceInKm`<=1 
ORDER BY `distanceInKm` ASC

我的方法

public List<Restaurants> getRestaurantsByDistance(FilterRestaurantRequest filterRestaurantRequest) throws SQLException, ClassNotFoundException, IOException {
        Session session = sessionFactory.getCurrentSession();
        Float latitude = Float.parseFloat(filterRestaurantRequest.getLatitude());
        Float longitude = Float.parseFloat(filterRestaurantRequest.getLongitude());
        String sql = "SELECT restaurant_id,restaurant_name,category_id,image_url,longitude,latitude,contact_name,primary_phone,secondary_phone,fax,address1,address2,((ACOS(SIN(:lat * PI() / 180) * SIN(latitude * PI() / 180) + COS(:lat * PI() / 180) * COS(latitude * PI() / 180) * COS((:lon-longitude) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS `distanceInKm` FROM `restaurants` HAVING `distanceInKm`<=1 ORDER BY `distanceInKm` ASC";
        Query query = session.createSQLQuery(sql).addEntity(Restaurants.class);
        query.setParameter("lat", latitude);
        query.setParameter("lon", longitude);
        List<Restaurants> restaurantses = query.list();
        return restaurantses;
    }

【问题讨论】:

    标签: java mysql spring hibernate rest


    【解决方案1】:

    我认为如果你要进行一些计算,你可以将虚拟列表示为数据库中的 SQL 公式或列值。如果我理解你 @Formula 注释会做你想做的事。这是教程http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#d0e6481 这是示例http://gokhan.ozar.net/hibernate-derived-properties-formula-annotation/

    【讨论】:

    • 我已经用 query 更新了我的问题。请告诉我如何将它应用到我的 query 中。我之前尝试过 @Formula 注释,但无法做到..
    • 我相信你之前已经尝试过了,但你能不能试试我的公式解决方案 @Formula("(select ((ACOS(SIN(latitude * PI() / 180) * SIN) (r.latitude * PI() / 180) + COS(latitude * PI() / 180) * COS(r.latitude * PI()/180) * COS((longitude-r.longitude) * PI() / 180)) * 180/PI()) * 60 * 1.1515) 作为距离餐厅 r 的距离 InKm (distanceInKm)
    猜你喜欢
    • 2023-01-19
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    相关资源
    最近更新 更多