我相信下面的代码工作正常,但我的逻辑有缺陷,所以我正在寻求帮助以获得我真正想要的结果。此外,我认为我对JPA方法的尝试过于复杂,可能有更干净的解决方案。我知道我可能会使用@Query,但我想尝试让方法名解决方案也正常工作,这样我就可以了解我哪里出错了。
为了简单起见,我在本例中剥离了DB表,但是我有表1,它是顶级表,表2位于它下面,有一个外键返回到表1。
表1-
不幸的是,我相信通过下面的代码,它可以识别出表2的其中一条记录在所需的日期范围内,因此正在从表1中提取与ID相关的所有记录。但我可能在这一点上错了,逻辑也可能以不同的方式存在缺陷。
任何帮助都将不胜感激。
表1实体类
@Entity
@Table(name = "TABLE1")
public class Table1 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID", nullable = false, unique = true)
private Integer id;
@OneToMany(mappedBy = "table1", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@Fetch(value = FetchMode.SUBSELECT)
@JsonManagedReference
private List<Table2> table2;
//Plus getters & setters
表2实体类
@Entity
@Table(name = "TABLE2")
public class Table2{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID", nullable = false, unique = true)
private Integer id;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "Table1Id")
@JsonBackReference
private Table1 table1;
@Column(name = "EffectiveDateTime", nullable = false)
private LocalDateTime effectiveDateTime;
//Plus getters & setters
回购类
@Repository
public interface Repository extends JpaRepository<Table1, Integer>, JpaSpecificationExecutor<Table1> {
public Optional<Table1> findTopByIdAndTable2EffectiveDateTimeLessThanEqualOrderByTable2EffectiveDateTimeDesc(int id, LocalDateTime now);
}
当前JSON返回
{
"id": 5
"Table2": [
{
"id": 6,
"effectiveDateTime": "2021-01-01T00:00:01"
},
{
"id": 8,
"effectiveDateTime": "2022-01-01T00:00:01"
},
{
"id": 9,
"effectiveDateTime": "2023-01-01T00:00:01"
}
]
}
一旦声明了oneToMany关系,实体将在调用getTable方法时加载所有连接的实体(序列化时jackson会调用该方法)。我相信如果您激活调试模式,您将看到2个请求,第一个是您在repopitory中描述的请求,第二个是JPA用于加载所有相关table2实体的请求。
他们提供了一些可能的方法来实现您的目标:
希望这有帮助!
这个问题是jOOQ的扩展:在单个对象中返回带有join、groupby和count的列表,但现在返回的是三个对象,而不是两个。 主意 具体示例 如何从查询中获取结果?
所以我有两个表,并且有一个预期的行增量,但是这个增量不会返回,除非我使用左外连接。有人能帮我理解为什么查询1适用于这个用例,而查询2不适用:
我尝试离线使用Android的语音识别API,就像这个问题一样,Android离线语音识别只显示一个结果?。我在线时也会得到五个结果,离线时只会得到一个结果,我希望在任何一种情况下都能得到五个(ish)结果。这仅仅是Android内置语音识别引擎的一个限制,还是有一些隐藏的设置可以更改以强制生成多个结果? 这是我的意图设置: 和我的onResults(): 我正在运行Android 4.4.2。
我的数据库中有两个表: 表1:购买物品 表1列出了购买的物品,表2每小时更新一次每件物品的当前价格。因此,从表2中可以清楚地看出,肉类最后一次交易是在2013年2月20日上午10点,而鱼类不是在同一天交易的,它是在2013年2月19日上午9点交易的,鸡肉是在2013年2月20日上午9点交易的。我想做的是,列出表1中的所有项目,并加入表2中各个项目的最后交易价格,如下所示: 这里应该应用什么类型的连
任何帮助都将不胜感激。
问题内容: 如果我有多个选择,例如: …如果第一个选择返回内容,我得到1个结果集。但是,如果运行第二个,我将得到两个结果集。第一个没有行,第二个没有行。 如果运行第二个选择,是否有办法仅返回第二个结果集? 谢谢! 问题答案: 您需要通过 在 运行选择 之前 检查是否会返回任何结果来阻止首次选择。 例如: