【问题标题】:optional jpa property based on if is present in table for jpa entity基于 if 的可选 jpa 属性是否存在于 jpa 实体的表中
【发布时间】:2021-04-08 02:00:32
【问题描述】:

我有这个实体

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 * from jpa) 时会出错,因为它无法在表中找到距离,因为它在数据库中不可用,唯一可用的时间距离是使用 getProximalShops 查询计算时和即时生成,我不需要在我的原始模式中定义它。

有没有办法将它定义为可选,最好只在数据库有该列时设置它?我试过@transient,但在使用 getProximalShops 时没有设置距离,但 findall(select * from jpa) 语句有效。

【问题讨论】:

    标签: java spring-boot spring-data-jpa h2


    【解决方案1】:

    您可以为 findAll() 方法提供一个查询,并在该查询中包含一个适当的“空”值作为距离。

    由于您已将距离定义为原始双精度,因此您必须提供一个实际的双精度,但这可能会造成混淆。您可能希望将其更改为 Double 对象,并从 findAll() 查询中返回 null。

    哦,顺便说一句,您可能不应该使用“select *”,而应该明确命名列。虽然它经常按您的预期工作,但实际上不能保证从“select *”返回的列的顺序。

    【讨论】:

    • 我不认为这是一个干净的解决方案,因为如果我必须更新实体,我将不得不更新查找所有查询,应该有一些注释这个问题应该是一个常见的问题。选择顺序也无关紧要,因为 jpa 无论如何都会将这些值映射到 pojo。
    • AFAIK,您正在寻找的功能不存在。因此,解决方法。祝你好运!
    猜你喜欢
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    相关资源
    最近更新 更多