【发布时间】: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