【发布时间】:2020-06-20 01:43:09
【问题描述】:
我有一个带有 JOIN 的 HQL 查询,但连接实体上的 where 子句(instrPrice.date BETWEEN :dateFrom AND :dateTo )不起作用。查询始终返回 instrumentPrice 的所有记录,而不是按日期限制结果。
命名查询
@NamedQuery(name = "findAllPrices",
query = "SELECT DISTINCT taPat FROM TaPatternInstrument taPat "
+ "LEFT JOIN FETCH taPat.instrument instr "
+ "LEFT JOIN instr.instrumentPriceList instrPrice "
+ "WHERE taPat.id = :taPatternInstrumentId "
+ "AND instrPrice.date BETWEEN :dateFrom AND :dateTo ")
调用查询的服务
public TaPatternInstrument findAllPrices(int taPatternInstrumentId, LocalDate dateFrom, LocalDate dateTo) {
TypedQuery<TaPatternInstrument> typedQuery = createNamedQuery("findAllPrices",
TaPatternInstrument.class);
typedQuery.setParameter("taPatternInstrumentId", taPatternInstrumentId);
typedQuery.setParameter("dateFrom", dateFrom);
typedQuery.setParameter("dateTo", dateTo);
return typedQuery.getSingleResult();
}
实体
public abstract class BaseEntity implements Serializable {
@Id
@Column(name = "id")
@GeneratedValue(strategy =
GenerationType.IDENTITY)
protected int id; ...
}
public class TaPatternInstrument extends BaseEntity {
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "instrument_id", nullable = false, foreignKey = @ForeignKey(name =
"tapatterninstrument_instrument_fk"))
private Instrument instrument;
}
public class Instrument extends BaseEntity {
@OneToMany(mappedBy = "instrument", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<InstrumentPrice> instrumentPriceList;
}
生成的 SQL
SELECT DISTINCT tapatterni0_.id AS id1_34_0_,
...
FROM tapatterninstrument tapatterni0_
LEFT OUTER JOIN instrument instrument1_
ON tapatterni0_.instrument_id = instrument1_.id
LEFT OUTER JOIN instrumentprice instrument2_
ON instrument1_.id = instrument2_.instrument_id
WHERE tapatterni0_.id = ?
AND ( instrument2_.date BETWEEN ? AND ? )
【问题讨论】:
-
您是否尝试过使用任何其他类型的日期?此问题是否仅与 LocalDate 相关?
-
你的数据集是什么?或者一个例子?另外,您是否在带有本机 sql 的 DMBS 中使用此查询来检查查询是否正常?
-
我必须使用 LocalDate 因为在实体 InstrumentPrice 中,属性日期定义如下:private LocalDate date;
-
我在贴出问题的末尾添加了生成的sql。
-
它给出的错误是什么?堆栈跟踪?
标签: java spring hibernate join where-clause