Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用实体管理器查询日期_Java_Mysql_Hibernate_Date_Jpa - Fatal编程技术网

Java 使用实体管理器查询日期

Java 使用实体管理器查询日期,java,mysql,hibernate,date,jpa,Java,Mysql,Hibernate,Date,Jpa,Backgound:我使用JPA(hibernate impl)+spring 我有两个表,第一个是ok的,它有一个主键,甚至可以与java.Util.Date字段一起使用。另一个在主键中有3个参数(这是我第一次使用它): 完整架构: CREATE TABLE `hotels` ( `id_room` int(11) NOT NULL DEFAULT '0', `id_hotel` int(11) NOT NULL DEFAULT '0', `day` date NOT NULL,

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

完整架构:

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;
....
酒店等级

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更改为字符串,并更改查询:

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数据库并获取信息

更新: 它也不起作用

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

如果您使用的是Java日期,则命名参数day将设置为带有时间戳的日期。为了确认这一点,请启用hibernate日志打印sql参数值

log4j.logger.org.hibernate.type=trace

参考:

您可以尝试使用以下查询: 从h中选择h,其中h.roomId=:roomId和h.hotelId=:hotelId和h.day=日期\格式(:day,格式)

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


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

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