gpt4 book ai didi

java - Hibernate 命令外键表

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:16:56 25 4
gpt4 key购买 nike

我有一个 REST API(带 Hibernate 的 Spring REST),它是我所有数据的访问点。客户端应用程序(Cordova 和 AngularJS)连接到此 API 以获取数据馈送。

我在 REST API 中的版本是:

Spring :4.2.3.RELEASE

hibernate :4.3.11.Final


问题

在客户端应用程序中,我需要一个有序列表。当我从 REST API 请求列表时,列表几乎每次都以不同的方式排序。这很烦人,因为列表中的一些文本显示在屏幕上,现在看起来好像在跳来跳去。


hibernate

在我的项目中,我有以下 Hibernate 设置:

公司

@OneToMany(fetch = FetchType.LAZY, mappedBy = "companyId", cascade = {CascadeType.ALL})
@JsonBackReference
private Set<Employee> employees= new HashSet<Employee>();

员工

@NotNull
@Column(name = "companyId", nullable = false)
private int companyId;

一个公司可以有很多员工,但是一个员工一次只能在一家公司工作。


hibernate 存储库

由于我是否使用查询的问题,这里是我的存储库(使用 Criteria/让 hibernate 来完成这项工作):

public Employee findById(int id) {
Criteria criteria = getSession().createCriteria(Employee.class);
criteria.add(Restrictions.eq("id", id));
return (Employee) criteria.uniqueResult();
}

Spring

为了更好地处理数据,我正在使用序列化模型。我按如下方式实现了这个(在我的 RestController 中):

Company company = companyManager.findCompanyWithEmployees(companyName);

Set<Employee> types = company.getEmployees();
Set<EmployeeList> list = new HashSet<EmployeeList>();

for (IncidentType item : types) {
EmployeeList newItem = new EmployeeList();
newItem.setId(item.getId())
.setParent(item.getParent())
.setChildren(item.getChildren())
.setTitle(item.getTitle())
.setImage(item.getImage());

list.add(newItem);
}

此代码创建了一个 EmployeeList 项目列表,我将其返回并在我的 AngularJS 代码中进行处理。


我试过了

  • 我尝试在 Employee 存储库 (findById) 中添加一个条件,但 Hibernate 在通过外键获取表时似乎不使用该存储库。

  • 尝试添加注解,但 Hibernate 不支持 order by 的注解。


额外信息

由于我使用 LAZY 加载(出于性能原因),我在我的存储库中使用了以下代码:

public Company findCompanyWithInterface(String companyName) {
Company company = this.findByName(companyName);

if (company == null) {
return null;
}
//activate hibernate to load the employees (is LAZY loaded)
Hibernate.initialize(company.getEmployees());

return company;
}

我的问题

有什么方法可以告诉 Hibernate 对通过公司实体获得的员工列表进行排序吗?我知道我可以在我的代码中对其进行排序,但这对性能来说非常糟糕。因此,如果 Hibernate 可以订购这些元素,那就太好了。

按 ID 排序应该没问题。如果我想要别的东西,我总是可以改变它。

有谁知道我如何在不影响性能的情况下实现这一点?


解决方案

Hibernate 没有针对 order by 的特定注解。 javax.persistence 确实有一个用于排序的注释 (@OrderBy())。 Hibernate 检查此注释并对结果进行排序。

您需要为此使用 ArrayList,以便保留顺序(答案如下)。

答案归功于 Benjamin Bau

最佳答案

为您的员工添加@OrderBy 注释。将字段从集合更改为列表,以便保留顺序。

@OneToMany(fetch = FetchType.LAZY, mappedBy = "companyId", cascade = {CascadeType.ALL})
@OrderBy("id")
@JsonBackReference
private List<Employee> employees = new ArrayList<Employee>();

关于java - Hibernate 命令外键表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34138106/

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