java—jpa实体的表中存在基于if的可选jpa属性

xqkwcwgp  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(348)

我有这个实体

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(selectfrom jpa)时,它会出错,因为它无法在表中找到距离,因为它在数据库中不可用,唯一可用的时间距离是在使用getproximalshops查询计算并动态生成时,我不需要在原始模式中定义它。
有没有一种方法可以将它定义为可选的,最好只在db有该列时设置它?我尝试了@transient,但是在使用getproximalshops时距离没有设置,但是findall(select
fromjpa)语句可以工作。

c9qzyr3d

c9qzyr3d1#

您可以为findall()方法提供一个查询,并在该查询中为距离包含一个适当的“空”值。
既然您已经将距离定义为一个基本的double,那么就必须提供一个实际的double,但这可能会让人困惑。您可能希望将其更改为double对象,并从findall()查询返回null。
哦,顺便说一句,您可能不应该使用“select*”,而应该显式地命名列。虽然它经常像您所期望的那样工作,但实际上并不能保证从“select*”返回的列的顺序。

相关问题