hibernate - JPA:如何使用 Criteria API 管理未映射的表
问题描述
我在两个实体和之间有@ManyToMany
关系,因此 Hibernate 为我创建了一个未映射的表,命名为数据库,我的 java 代码中没有相关实体。另外,我正在尝试使用 Criteria API 从我的 dao 查询该表。有人可以帮我找出解决方案吗?我正在尝试在以下示例中做类似的事情:A
B
A_B
A_B
Criteria API
select * from A_B where A_B.column = id_input;
解决方案
首先是映射ORM。在 JPA(使用 JPQL)中,您使用类的字段,因此如果您在类中有关系,您可以使用它在存储库中创建方法名称。例子:
客户实体:
@Entity
public class Client {
@Id
@GeneratedValue
private Long id;
private String name;
private String description;
}
和带有标记的产品实体,该关系是从客户端实体映射的
@Entity
public class Product {
@Id
@GeneratedValue
private Long id;
@Column(name="name")
private String productName;
private String description;
@ManyToMany(mappedBy="products")
private List<Client> clients;
}
现在存储库按产品名称查找客户:
@Repository
public interface ClientRepository extends JpaRepository<Client, Long>{
List<Client> findByProducts_ProductName(String name);
}
上面的示例创建带有名称client_products
和列的连接表,clients_id
并且products_id
- 使用字段名称来生成列名称。如果要自定义表名或列名,则必须将其映射到客户端实体:
@ManyToMany
@JoinTable(
name="products_of_client",
joinColumns = @JoinColumn(name="client_id"),
inverseJoinColumns = @JoinColumn(name="product_id")
)
private List<Product> products;
此更改创建具有名称products_of_client
和列名的表client_id
和product_id
. 它不影响存储库中的方法名称
推荐阅读
- reactjs - React.js 中的间歇性类型错误
- ios - 谷歌平面缓冲区 iOS
- c# - 如何使用 select onchange 更改 ViewData?
- javascript - 我可以使用在线表单但不使用数据库自动填充 HTML 页面吗?
- java - 如何将具有嵌套对象的复杂 json 文件映射到 java 对象?
- sql - 有没有办法通过使用查询从 SQL Server 导出?
- vue.js - vuex 存储模块箭头函数中的语法错误
- angular - transaction.set(...) 是同步的吗?
- jquery - 即使尚未加载,如何将带有参数的侦听器附加到元素
- javascript - 在 Javascript 中,会发生解析错误。“意外的代币资金”