gpt4 book ai didi

java - 使用实体管理器查询日期

转载 作者:行者123 更新时间:2023-11-30 22:53:49 25 4
gpt4 key购买 nike

背景:我使用 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));

它找到数据。

问题是如何将日期(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);

最佳答案

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

log4j.logger.org.hibernate.type=trace

引用:How to print a query string with parameter values when using Hibernate

您可以尝试使用以下查询:“从酒店 h 中选择 h,其中 h.roomId=:roomId 和 h.hotelId=:hotelId 和 h.day=DATE_FORMAT(:day,format)”

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

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

关于java - 使用实体管理器查询日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27250720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com