gpt4 book ai didi

java - 按组划分的 JPA 实体的辅助 ID

转载 作者:行者123 更新时间:2023-11-30 07:46:12 27 4
gpt4 key购买 nike

假设有 2 个 JPA 实体:

public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

@ManyToOne
@JoinColumn(name = "CITY_ID")
private City city;

@Temporal(TemporalType.TIMESTAMP)
private Date createdAt;

String name;
}

public class City {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

@OneToMany(mappedBy = "city")
List<Person> people;
}

有 10 个“城市”对象,每个对象中有 5 个不同的“人”,这样“人”表中总共有 50 个项目,是随机生成的。

现在我想通过查询休息端点来列出“City”ID 3 中的“Person”对象:

GET /api/cities/3/people

假设来自其余 api Controller 的响应是:

[
{ id : 11, city_id: 3, created_at: 1445831581186, name: 'Michael' },
{ id : 19, city_id: 3, created_at: 1446831581186, name: 'Jennifer' },
{ id : 26, city_id: 3, created_at: 1447831581186, name: 'Josh' },
{ id : 27, city_id: 3, created_at: 1448831581186, name: 'Aaron' },
{ id : 45, city_id: 3, created_at: 1449831581186, name: 'Gabriel' }
]

我需要的是像这样的响应:

[
{ id : 1, city_id: 3, created_at: 1445831581186, name: 'Michael' },
{ id : 2, city_id: 3, created_at: 1446831581186, name: 'Jennifer' },
{ id : 3, city_id: 3, created_at: 1447831581186, name: 'Josh' },
{ id : 4, city_id: 3, created_at: 1448831581186, name: 'Aaron' },
{ id : 5, city_id: 3, created_at: 1449831581186, name: 'Gabriel' }
]

对于过滤查询:

GET /api/cities/3/people?createdAfter=1447831581186

[
{ id : 4, city_id: 3, created_at: 1448831581186, name: 'Aaron' },
{ id : 5, city_id: 3, created_at: 1449831581186, name: 'Gabriel' }
]

我的意思是,json 响应 ID 必须在“城市”域内重新排序。

MySQL 数据库上的 ID 必须仍然是原始 ID 11、19、26、27 和 45,我不希望/需要这个“临时”ID 持续存在,但我可以有一个辅助“ID_IN_CITY”列如果需要的话。另外,如果我更改“人”的“城市”,则必须重新计算此辅助 ID。

实现这一目标的最佳技术是什么?

这个例子只是为了说明我的问题,我的目标是让 ids 对我的系统的最终用户来说是干净的。当他们创建第一个项目时,他们会看到漂亮的 ID 1,而不是 ID 3455958。也没有让他们知道我的数据库有多大。

谢谢

最佳答案

首先,让我问一个看似不必要但值得问的问题:

为什么您希望用户在首次创建用户时看到“1”很重要?

这似乎是一个愚蠢的要求,甚至可能是一种代码味道。

为了回答你的问题,这是老派的黑客而不是 JPA 解决方案,但你可以在内存中保存一个 ids map 来映射到已显示的记录。例如,您可以将“Michael”记录的数据库 ID 存储在 Map 对象中,该对象将数据库 ID 作为键,将显示的 ID 作为值。如果 Map 中不存在 DB id,则添加它,并增加请求 ID 号。

...
static Map<Long, Long> idGrid = new HashMap<Long, Long>();
long displayId = 1L;

//then insert
idGrid.put(databaseId, displayId++);

//remove
idGrid.remove(databaseId);

//get an id
Long displayId = idGrid.get(databaseId);

...

这将允许您存储任何数据库 ID,并向用户显示任何其他任意 ID。

关于java - 按组划分的 JPA 实体的辅助 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33918849/

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