JPA с использованием @SQLInsert выбрасывает индекс параметра за пределы диапазона - PullRequest
0 голосов
/ 15 ноября 2018
@Data
@MappedSuperclass
public class BaseModel implements Serializable {
 private static final Long serialVersionUID = -1442801573244745790L;

 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 private Long id;

 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 @Convert(converter = LocalDateTimeConverter.class)
 private LocalDateTime createAt = LocalDateTime.now();

 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 @Convert(converter = LocalDateTimeConverter.class)
 private LocalDateTime updateAt = LocalDateTime.now();
}


@Data
@Entity
@Table(name = "tb_vip_code")
@SQLInsert(sql = "insert ignore into tb_vip_code (code, duration) values (?, ?)")
public class VipCode extends BaseModel {
private static final Long serialVersionUID = -4697221755301869573L;

private String code;
private Integer duration;
private Integer status = 0;
private Long userId;

public VipCode() {}
}

@Test
public void addOne() throws Exception {
    VipCode vipCode = new VipCode();
    vipCode.setCode("123456");
    vipCode.setDuration(1);
    service.addOne(vipCode);
}

create table tb_vip_code
(
id bigint auto_increment
    primary key,
code varchar(20) not null,
status int default '0' not null,
user_id bigint null,
duration int not null,
create_at datetime default CURRENT_TIMESTAMP not null,
update_at timestamp default CURRENT_TIMESTAMP not null,
constraint tb_vip_code_code_uindex unique (code)
);

Весь код, как указано выше, я пытаюсь использовать пользовательский sql для сохранения объекта, но он выдает исключение: Вызывается: java.sql.SQLException: индекс параметра вне диапазона (3> количество параметров, которое равно 2).

У меня есть только параметры буксировки, почему он говорит, что нужно три?

1 Ответ

0 голосов
/ 15 ноября 2018

Оператор SQL, заданный @SQLInsert, получает поля вашей сущности, связанные в качестве параметров.

У вас есть как минимум 4 атрибута в вашей сущности VipCode напрямую, и я подозреваю, что еще больше из класса BaseModel, от которого она наследуется.Но ваш SQL-запрос ожидает только два параметра.

Чтобы устранить проблему, удалите лишние атрибуты из сущности, добавьте параметры для них в запрос или отметьте их как @Transient.

...