我在我的Entity
中定义了一个虚拟列Entity
,用于一些距离计算,并与distanceInKm
一起给出用户的响应,这是一个虚拟列,而不是我的表中的一个列,它运行良好-- (case 1)。
现在使用相同的实体从表中获取所有值,但获取com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'restaurant0_.distanceInKm' in 'field list'
.(案例2)。
我了解了用于calculation.but的虚拟列的calculation.but注释的用法,如果使用的是虚拟列不会序列化/添加到中的用户响应(例1),则.i需要使用一个实体实现API
ie、Case 1和Case 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;
}
发布于 2015-08-05 12:00:00
我认为如果要进行一些计算,可以将虚拟列表示为数据库中的SQL公式或列值。如果我理解你的话,@式注释就会做你想做的事。这里是教程single/#d0e6481,这是示例http://gokhan.ozar.net/hibernate-derived-properties-formula-annotation/
https://stackoverflow.com/questions/31829190
复制相似问题