необязательное свойство jpa, основанное на if, присутствует в таблице для объекта jpa

#java #spring-boot #spring-data-jpa #h2

#java #spring-boot #spring-data-jpa #h2

Вопрос:

у меня есть этот объект

 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
);
 

но когда я пытаюсь выполнить обычный поиск (выбрать * из jpa), он выдает ошибку, потому что он не может найти расстояние в таблице, поскольку оно недоступно в базе данных, доступно только временное расстояние, когда оно вычисляется с помощью запроса getProximalShops и генерируется на лету, мне не нужно определять его в моемисходная схема.

есть ли способ определить его как необязательный, предпочтительно устанавливать его только тогда, когда в базе данных есть этот столбец? я пробовал @transient, но расстояние просто не устанавливается при использовании getProximalShops, но работает оператор findall(select * from jpa).

Ответ №1:

Вы можете предоставить запрос для метода findAll() и включить в этот запрос соответствующее «пустое» значение для расстояния.

Поскольку вы определили distance как примитивный double , вам нужно будет указать фактический double, но это может сбить с толку. Возможно, вы захотите изменить это на объект Double и вернуть null из запроса findAll().

О, и кстати, вам, вероятно, не следует использовать «выбрать *» и следует явно называть столбцы. Хотя это часто работает так, как вы ожидаете, на самом деле нет никакой гарантии в отношении порядка столбцов, возвращаемых из «select *».

Комментарии:

1. я не думаю, что это чистое решение, потому что, если мне когда-нибудь придется обновлять сущность, мне придется обновить запрос find all, должна быть какая-то аннотация к этой проблеме, это должно быть общей проблемой. также порядок выбора не имеет значения, поскольку jpa в любом случае сопоставляет эти значения с pojo.

2. AFAIK, функция, которую вы ищете, не существует. Поэтому обходной путь. Удачи!