【问题标题】:query with date using entity manager使用实体管理器查询日期
【发布时间】:2015-01-30 18:38:00
【问题描述】:

背景:我使用 JPA (hibernate impl) + spring 我有两个表,第一个还可以,它有一个主键,甚至可以使用 java.Util.Date 字段。另一个在主键中有 3 个参数(这是我第一次使用它):

PRIMARY KEY (`id_room`,`id_hotel`,`day`),

完整架构:

CREATE TABLE `hotels` (
  `id_room` int(11) NOT NULL DEFAULT '0',
  `id_hotel` int(11) NOT NULL DEFAULT '0',
  `day` date NOT NULL,
  PRIMARY KEY (`id_room`,`id_hotel`,`day`),
  KEY `id_hotel` (`id_hotel`,`day`),
  KEY `day` (`day`),
  KEY `day-hotel` (`day`,`id_hotel`),
  KEY `hotel` (`id_hotel`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

所以我向我的实体添加了代码:

@Entity @IdClass(HotelId.class)
@Table(name="hotels")
public class Hotels implements Serializable {
    private static final Long serialVersionUID = 1L;

    @Id
    @Column(name="id_room")
    private int roomId;
    @Id
    @Column(name="id_hotel")
    private int hotelId;
    @Id
    @Temporal(TemporalType.DATE)
    private Date day;
....

HotelId.class

public class HotelId implements Serializable {
    private int roomId;
    private int hotelId;
    private Date day;

    public HotelId() {
    }

    public HotelId(int roomId, int hotelId, Date day) {
        this.roomId = roomId;
        this.hotelId = hotelId;
        this.day = day;
    }

    public int getRoomId() {
        return roomId;
    }

    public int getHotelId() {
        return hotelId;
    }

    public Date getDay() {
        return day;
    }
}

这个实体我卡了很长时间:

我今天几乎整天都在解决这个问题。 我有格式为(yyyy-mm-dd)的日期列的数据库。 我在项目中也有带有 java.util.Date 日期字段的实体类。 现在我正在尝试进行选择:

TypedQuery query = em.createQuery("Select h FROM Hotels h where h.roomId=:roomId and h.hotelId=:hotelId and h.day=:day", Hotels.class);
query.setParameter("roomId", roomId);
query.setParameter("hotelId", hotelId);
query.setParameter("day", date);

它说没有数据

现在我将日期字段从 java.util.Date 更改为 String 并更改我的查询:

TypedQuery query = em.createQuery("Select h FROM Hotels h where h.roomId=:roomId and h.hotelId=:hotelId and h.day=:day", Hotels.class);
query.setParameter("roomId", roomId);
query.setParameter("hotelId", hotelId);
query.setParameter("day", new SimpleDateFormat("yyyy-mm-dd").format(date));

它找到数据。

问题是如何将 date(java.util.Date) 发送到 MySql DB 并取回信息?

更新:

它也不起作用

@Entity 
    @Table(name="hotels")
    public class Hotels implements Serializable {
        private static final Long serialVersionUID = 1L;

        @Id
        private int id;
        @Column(name="id_room")
        private int roomId;

        @Column(name="id_hotel")
        private int hotelId;

        private java.sql.Date day;
        ....
    }

查询:

    java.sql.Date sqlDate = new java.sql.Date(day.getTime());
    TypedQuery query = em.createQuery("Select h FROM Hotels h where h.roomId=:roomId and h.hotelId=:hotelId and h.day=:day", Hotels.class);
query.setParameter("roomId", roomId);
query.setParameter("hotelId", hotelId);
            query.setParameter("day", sqlDate);

【问题讨论】:

  • 您能否提供hotels 表架构(即CREATE TABLE hotels... 查询)?
  • 能否提供MySql表的描述?
  • 可能是关于 java.util.Date。也许这篇文章对你有帮助stackoverflow.com/questions/2305973/…
  • 请尝试使用 java.sql.Date 并让我知道它是否有帮助
  • 将实体中的字段更改为 java.sql.Date 并将其添加到查询中,没有帮助:(我猜 Mysql 以另一种格式获取日期,例如:(dd-mm-yyyy)

标签: java mysql hibernate date jpa


【解决方案1】:

如果您使用 Java 日期,则您的命名参数 day 设置为带时间戳的日期。因此,为了确认这一点,启用休眠日志以打印 sql 参数值

log4j.logger.org.hibernate.type=trace

参考:How to print a query string with parameter values when using Hibernate

您可以尝试使用以下查询: "Select h FROM Hotels h where h.roomId=:roomId and h.hotelId=:hotelId and h.day=DATE_FORMAT(:day,format)"

如果酒店表中有数百万条记录,则使用 DATE_FORMAT 函数的缺点会影响记录检索的性能。

因此在java级别转换为字符串并在命名参数中设置相同是更好的选择。

【讨论】:

    猜你喜欢
    • 2016-07-02
    • 1970-01-01
    • 2014-09-13
    • 2011-11-23
    • 2018-10-28
    • 2013-10-19
    • 2013-05-24
    • 2019-10-06
    • 1970-01-01
    相关资源
    最近更新 更多