Изменить SQL на Критерии или HQL

0

Изменить этот запрос

SELECT 
    * 
FROM 
    Authors 
WHERE 
    born <= DATE_ADD(CURDATE(), interval -55 year) 

к запросу Критерии. Это моя неудачная попытка

 List<Book> bookList = session.createQuery("from Book where born <= DATE_SUB(current_date , INTERVAL 10 year)").list();
  • 0
    Можете ли вы опубликовать трассировку стека, а также получить дополнительную информацию о вашей проблеме?
Теги:
spring
hibernate

1 ответ

0
Лучший ответ

Проблема заключается в том, что Spring отправляет запросы как объекты json, а затем пытается преобразовать их в модель, в которую вы прошли. В этом случае это "Автор", который определяет дату рождения, но строка, которая отправляется, не находится в правильный формат даты, который будет преобразован в Date.

Есть два способа, которыми вы можете справиться.

1) Создайте автору POJO, который определяет дату как String, а затем выполните преобразование в объект Author вручную, указав формат даты

2) Создайте класс deslierizer Date, который примет строку и назовите ее в дату для указанного поля:

Это использует библиотеку Джексона:

public class DateTimeStampDeserializer extends JsonDeserializer<Date> {

  private static final String DEFAULT = "MM/dd/yyyy";
  private static final String EXPANDED = "MM/dd/yyyy HH:mm:ss z";
  private static final String EXPANDED_WITH_TIMEZONE = "MMM d, yyyy HH:mm:ss z";
  private static final String EXPANDED_WITH_AM_PM = "MMM d, yyyy h:mm:ss a";

  private static final String FORMAT_1 = "yyyy-dd-MM";
  private static final String FORMAT_2 = "yyyy/dd/MM";
  private static final String FORMAT_3 = "yyyy.dd.MM";
  private static final String FORMAT_4 = "yyyyddMM";

  private static final String[] formats = new String[] {
      DEFAULT,
      EXPANDED,
      EXPANDED_WITH_TIMEZONE, 
      EXPANDED_WITH_AM_PM,
      FORMAT_1,
      FORMAT_2,
      FORMAT_3,
      FORMAT_4
  };

  private static final Integer[] styles = new Integer[] {
      SimpleDateFormat.LONG,
      SimpleDateFormat.FULL,
      SimpleDateFormat.MEDIUM,
      SimpleDateFormat.SHORT
  };

  @Override
  public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
    String value = p.getText();

    Date date = null;
    //First try to see if the value can be parsed into a long
    try {
      date = new Date(Long.parseLong(value));
      return date;
    } catch (Exception ex) { }

    //Next iterate over the built in styles to see if it can be converted
    for (Integer style: styles) {
      date = formatDate(style, value);
      if (date != null) {
        return date;
      }
    }

    //Lastly iterate over the custom styles specified in format to see if it can be converted
    for (String fmt : formats) {
      date = formatDate(fmt, value);
      if (date != null) {
        return date;
      }
    }

    //Return null if date format can't be converted
    return null; 
  }

  /**
   * Convert a string value to a date object
   * @param format The format to use in reference to the source 
   * @param source the source to convert
   * @return Date object if the conversion was success; null otherwise
   */
  private static Date formatDate(String format, String source) {
    try {
      return new SimpleDateFormat(format).parse(source);
    } catch (Exception ex) {
      return null;
    }
  }

  /**
   * Convert a string value to a date object using SimpleDateFormats 
   * built in styles
   * @param style The style to use
   * @param source the source to convert
   * @return Date object if the conversion was success; null otherwise
   */
  private static Date formatDate(Integer style, String source) {
    try {
      return SimpleDateFormat.getDateInstance(style).parse(source);
    } catch (Exception ex) {
      return null;
    }
  }
}

Затем, чтобы использовать его в своем Entity, вы просто делаете

@JsonDeserialize(using=DateTimeStampDeserializer.class)
@Column(name = "born")
@Temporal(TemporalType.DATE)
private java.util.Date born;

Библиотеки Джексона могут быть добавлены в ваш проект через maven (при использовании maven)

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.6</version>
</dependency>


<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.6</version>
</dependency>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню