【发布时间】:2020-05-11 13:29:51
【问题描述】:
我正在使用旧系统,其中日期以 dd.MM.yyyy 格式存储在 char(10) 列中。是否可以透明地在 String 和 LocalDate/Date 之间转换以编写类似的查询
Iterable<User> findByRegistrationDateBefore(LocalDate deadline)
我尝试在 JPQL 中使用自定义 @Query,但我总是使用依赖于数据库的函数,这并不好。
@Query("select u from User u where DATE(u.registrationDate) < DATE(:deadline)")
Iterable<User> customFind(@Param("deadline") LocalDate deadline);
这应该适用于 MySQL,但由于我使用 H2,它不会同时适用于两者。有没有办法/解决方法来存档这个?我想在数据库中按日期搜索,无法加载所有条目并在 java 中搜索。
import java.util.Date;
import javax.persistence.*;
import org.springframework.format.annotation.DateTimeFormat;
import com.example.datecharcolumn.DateFormatConverter;
import lombok.NoArgsConstructor;
import lombok.ToString;
@NoArgsConstructor
@Entity
@Table(name = "user")
@ToString
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID", nullable = false, precision = 5)
private Integer userId;
@Convert(converter = DateFormatConverter.class)
@Column(name ="REGDAT", nullable = false, length = 10, columnDefinition = "char(10)")
private Date registrationDate;
}
@Repository
public interface UserRepository extends CrudRepository<User, Integer> {
Iterable<User> findByRegistrationDateAfter(Date d);
}
@SpringBootApplication
public class DateCharcolumnApplication {
public static void main(String[] args) {
SpringApplication.run(DateCharcolumnApplication.class, args);
}
}
@Converter
public class DateFormatConverter implements AttributeConverter<Date, String> {
private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy");
@Override
public String convertToDatabaseColumn(Date attribute) {
final String format = simpleDateFormat.format(attribute);
return format;
}
@Override
public Date convertToEntityAttribute(String dbData) {
try {
Date parse = simpleDateFormat.parse(dbData);
return parse;
} catch (ParseException e) {
e.printStackTrace();
}
return new Date();
}
}
我的想法是 JPQL 足够智能,可以支持日期函数的表达,并将它们转换为相应的数据库方言(或者有办法让它变得智能)。但目前(在 h2 上)它只是绑定到 VARCHAR 并进行字符串比较(假设这不是适用于日期的特殊 H2 语法):
select user0_.id as id1_0_, user0_.regdat as regdat2_0_ from user user0_ where user0_.regdat>?
Hibernate: select user0_.id as id1_0_, user0_.regdat as regdat2_0_ from user user0_ where user0_.regdat>?
2020-05-11 17:00:38.877 TRACE 4288 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [VARCHAR] - [20.07.2020]
【问题讨论】:
-
比较你需要使用日期数据库函数,因为查询在数据库上运行或获取所有数据然后在应用程序中进行比较
标签: java spring-boot spring-data-jpa