可选的 jpa 属性 基于 if 存在于 table 中用于 jpa 实体
optional jpa property based on if is present in table for jpa entity
我有这个实体
public class Shop implements Serializable {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String shop_name;
private String shop_street_address;
private String shop_zip;
private String shop_state;
private double SHOP_LATITUDE;
private double SHOP_LONGITUDE;
private double distance;
public Shop(String shop_name, String shop_street_address, String shop_zip, String shop_state, double SHOP_LATITUDE, double SHOP_LONGITUDE) {
this.shop_name = shop_name;
this.shop_street_address = shop_street_address;
this.shop_zip = shop_zip;
this.shop_state = shop_state;
this.SHOP_LATITUDE = SHOP_LATITUDE;
this.SHOP_LONGITUDE = SHOP_LONGITUDE;
}
public Shop() {
}
}
我也有这个带有 getProximalShops 语句的实体,效果很好
@Repository
public interface ShopRepository extends CrudRepository<Shop, Integer> {
@Query(
value =
"SELECT *, " +
"( 3959 * acos ( cos ( radians(?1)) * cos( radians( SHOP_LATITUDE ) ) * cos( radians( SHOP_LONGITUDE ) - radians(?2) ) + sin ( radians(?1) ) * sin( radians( SHOP_LATITUDE )) ) ) " +
"AS DISTANCE FROM SHOP_INFORMATION GROUP BY ID HAVING DISTANCE < 2000 ORDER BY DISTANCE ASC LIMIT 0, 20",
nativeQuery = true)
List<Shop> getProximalShops(@Param("user_latitude") Double userlatitude,@Param("user_longitude") Double userlongitude);
}
List<Shop> getProximalShops(@Param("user_latitude") Double userlatitude,@Param("user_longitude") Double userlongitude);
这是我的架构:
CREATE TABLE shop_information (
id INT AUTO_INCREMENT PRIMARY KEY,
shop_name VARCHAR(100) NOT NULL,
shop_street_address VARCHAR(100) NOT NULL,
shop_zip VARCHAR(10) NOT NULL,
shop_state VARCHAR(30) NOT NULL,
SHOP_LATITUDE DOUBLE NOT NULL,
SHOP_LONGITUDE DOUBLE NOT NULL
);
但是当我尝试执行常规 findall(select * 来自 jpa) 时它出错,因为它无法在 table 中找到距离,因为它在数据库中不可用,唯一的时间距离当使用 getProximalShops 查询计算并即时生成时可用,我不需要在我的原始模式中定义它。
有没有办法将它定义为可选的,最好只在数据库有该列时设置它?我试过@transient,但是在使用 getProximalShops 时没有设置距离,但是 findall(select * from jpa) 语句有效。
您可以为 findAll() 方法提供查询,并在该查询中包含适当的 'empty' 距离值。
由于您已将 distance 定义为原始双精度值,因此您必须提供实际的双精度值,但这可能会造成混淆。您可能希望将其更改为 Double 对象,并且 return 来自 findAll() 查询的 null。
哦,顺便说一句,您可能不应该使用“select *”,而应该明确命名列。虽然它经常像您预期的那样工作,但实际上并不能保证从“select *”开始的 return 列的顺序。
我有这个实体
public class Shop implements Serializable {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String shop_name;
private String shop_street_address;
private String shop_zip;
private String shop_state;
private double SHOP_LATITUDE;
private double SHOP_LONGITUDE;
private double distance;
public Shop(String shop_name, String shop_street_address, String shop_zip, String shop_state, double SHOP_LATITUDE, double SHOP_LONGITUDE) {
this.shop_name = shop_name;
this.shop_street_address = shop_street_address;
this.shop_zip = shop_zip;
this.shop_state = shop_state;
this.SHOP_LATITUDE = SHOP_LATITUDE;
this.SHOP_LONGITUDE = SHOP_LONGITUDE;
}
public Shop() {
}
}
我也有这个带有 getProximalShops 语句的实体,效果很好
@Repository
public interface ShopRepository extends CrudRepository<Shop, Integer> {
@Query(
value =
"SELECT *, " +
"( 3959 * acos ( cos ( radians(?1)) * cos( radians( SHOP_LATITUDE ) ) * cos( radians( SHOP_LONGITUDE ) - radians(?2) ) + sin ( radians(?1) ) * sin( radians( SHOP_LATITUDE )) ) ) " +
"AS DISTANCE FROM SHOP_INFORMATION GROUP BY ID HAVING DISTANCE < 2000 ORDER BY DISTANCE ASC LIMIT 0, 20",
nativeQuery = true)
List<Shop> getProximalShops(@Param("user_latitude") Double userlatitude,@Param("user_longitude") Double userlongitude);
}
List<Shop> getProximalShops(@Param("user_latitude") Double userlatitude,@Param("user_longitude") Double userlongitude);
这是我的架构:
CREATE TABLE shop_information (
id INT AUTO_INCREMENT PRIMARY KEY,
shop_name VARCHAR(100) NOT NULL,
shop_street_address VARCHAR(100) NOT NULL,
shop_zip VARCHAR(10) NOT NULL,
shop_state VARCHAR(30) NOT NULL,
SHOP_LATITUDE DOUBLE NOT NULL,
SHOP_LONGITUDE DOUBLE NOT NULL
);
但是当我尝试执行常规 findall(select * 来自 jpa) 时它出错,因为它无法在 table 中找到距离,因为它在数据库中不可用,唯一的时间距离当使用 getProximalShops 查询计算并即时生成时可用,我不需要在我的原始模式中定义它。
有没有办法将它定义为可选的,最好只在数据库有该列时设置它?我试过@transient,但是在使用 getProximalShops 时没有设置距离,但是 findall(select * from jpa) 语句有效。
您可以为 findAll() 方法提供查询,并在该查询中包含适当的 'empty' 距离值。
由于您已将 distance 定义为原始双精度值,因此您必须提供实际的双精度值,但这可能会造成混淆。您可能希望将其更改为 Double 对象,并且 return 来自 findAll() 查询的 null。
哦,顺便说一句,您可能不应该使用“select *”,而应该明确命名列。虽然它经常像您预期的那样工作,但实际上并不能保证从“select *”开始的 return 列的顺序。