我有一个A桌子和一个B桌子。两者JPA entity
,A和B类已经joda.time.datetime
Persistent Field
说的retentionDate
和lastmodifiedDate
分别。A还有一个Persistent Field
类型的int
说days
。现在,我想add number of a.days
进入a.retentionDate
,然后将其与b.lastmodifiedDate
using 进行比较JPA criteria API
。
实体类
@Entity
@Table(name = "A")
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@EqualsAndHashCode(of = "id", callSuper = false)
public class A extends AbstractBaseEntity {
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
@Column(unique = true, length = 36)
private String id;
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
@JsonDeserialize(using = DateTimeDeserializer.class)
@JsonSerialize(using = DateTimeSerializer.class)
private DateTime retentionDate;
private int days;
}
B实体类
@Entity
@Table(name = "B")
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@EqualsAndHashCode(of = "id", callSuper = false)
public class B extends AbstractBaseEntity {
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
@Column(unique = true, length = 36)
private String id;
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
@JsonDeserialize(using = DateTimeDeserializer.class)
@JsonSerialize(using = DateTimeSerializer.class)
private DateTime lastmodifiedDate ;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "A_ID")
private A a;
}
JPA标准查询:
CriteriaQuery<B> b = builder.createQuery(B.class);
Root<B> fromB = criteria.from(B.class);
Expression<DateTime> lastmodifiedDate = fromB.get(B_.lastmodifiedDate);
Expression<DateTime> retentionDate = fromB.get(B_.a).get("retentionDate");
Expression<int> days = fromB.get(B_.a).get("days");
Expression<DateTime> newDate = // how to add days in retentionDate here so it became a newDate?
b.select(fromB);
b.where(builder.greaterThanOrEqualTo(newDate , lastmodifiedDate)
);
请在上述查询中为我提供帮助,以在保留日期中添加天数。 谢谢。
您可以使用CriteriaBuilder#function()执行要添加days
到中的数据库函数retentionDate
。我已经使用DATEADD()制作了一个示例,因为我的测试项目使用H2数据库运行。
ParameterExpression<String> dayUnit = builder.parameter(String.class, "dayUnit");
Expression<DateTime> newDate = builder.function("DATEADD", DateTime.class, dayUnit, days, retentionDate);
完整的示例:
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<B> cq = builder.createQuery(B.class);
Root<B> fromB = cq.from(B.class);
Expression<DateTime> lastmodifiedDate = fromB.get(B_.lastmodifiedDate);
Expression<DateTime> retentionDate = fromB.get(B_.a).get("retentionDate");
Expression<Integer> days = fromB.get(B_.a).get("days");
ParameterExpression<String> dayUnit = builder.parameter(String.class, "dayUnit");
Expression<DateTime> newDate = builder.function("DATEADD", DateTime.class, dayUnit, days, retentionDate);
cq.where(builder.greaterThanOrEqualTo(newDate, lastmodifiedDate));
TypedQuery<B> tq = entityManager.createQuery(cq.select(fromB));
tq.setParameter("dayUnit", "DAY");
List<B> results = tq.getResultList();
该查询将转换为SQL,如下所示:
select
b0_.id as id1_1_,
b0_.a_id as a_id3_1_,
b0_.lastmodified_date as lastmodi2_1_
from b b0_
cross join a a1_
where b0_.a_id=a1_.id
and DATEADD(?, a1_.days, a1_.retention_date)>=b0_.lastmodified_date
问题内容: 我想在表中选择所有记录,这些记录的输入日期早于2个月。 知道我该怎么做吗? 我还没有尝试过任何东西,但是我在这一点上: 问题答案: 如果您使用的是SQL Server,请尝试以下操作: 根据您的更新,它将是:
问题内容: 我已经编写了一些代码来检查两个日期,即开始日期和结束日期。如果结束日期早于开始日期,则会提示您结束日期早于开始日期。 我还想添加检查开始日期是否在今天之前(今天和用户使用该应用程序的那天一样)。(下面的日期检查器代码,如果有任何影响,那么所有这些都为Android编写) 问题答案: 这有帮助吗?
我正在使用React,使用NodeJS将数据发送到我的PostgreSQL数据库。我的songs表中有一个外键,它引用了albums表中的id。我的问题是,如何将我第一次插入的id返回到第二次插入的相册中?以下是我目前的代码: 我还没有将专辑id添加到我的歌曲插入中。我在等着看如何把唱片id的值输入到我的第二个插页中?
Created_date类型为date 日期格式默认为yyyy-dd-MM
问题内容: 我有一个名为generate_table的函数,该函数需要2个输入参数(和) 现在,我尝试使用PLPGSQL处理第二个函数,该函数将获取所有分支的列表以及每个分支的最新日期,并将其作为参数传递给generate_table函数。 我的查询是这样的: 结果如下: 我需要的是函数运行这样的内容 我已经阅读了很多有关PLPGSQL的文章,但到目前为止,我只能说我几乎不了解其基础知识。 我读到
问题内容: 我的网站的命中SQL表格名为ExternalHits。我将URL跟踪为URLx,将访问页面的日期跟踪为Datex。我每周运行一次此查询,以获取前一周的总点击数,并且每周我都必须手动更改“之间”的日期。有什么方法可以更改查询,以使“之间”的日期类似于TODAY AND TODAY-7?我只是不想不必每周手动更改日期。 问题答案: