首页 > 解决方案 > JPA:如何使用 Criteria API 管理未映射的表

问题描述

我在两个实体和之间有@ManyToMany关系,因此 Hibernate 为我创建了一个未映射的表,命名为数据库,我的 java 代码中没有相关实体。另外,我正在尝试使用 Criteria API 从我的 dao 查询该表。有人可以帮我找出解决方案吗?我正在尝试在以下示例中做类似的事情:ABA_BA_BCriteria API

select * from A_B where A_B.column = id_input;

标签: hibernatejpacriteria-api

解决方案


首先是映射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_idproduct_id. 它不影响存储库中的方法名称


推荐阅读