【问题标题】:JPA : How to manage unmapped Table using Criteria APIJPA:如何使用 Criteria API 管理未映射的表
【发布时间】:2021-01-22 11:13:26
【问题描述】:

我在两个实体AB 之间有@ManyToMany 关系,因此Hibernate 为我创建了一个名为A_B 的未映射表到数据库中,而我的Java 代码中没有相关实体。另外,我正在尝试使用 Criteria API 从我的 dao 中查询 A_B 表。有人可以帮我找出解决方案吗?我正在尝试在Criteria API 中执行类似此示例的操作:

select * from A_B where A_B.column = id_input;

【问题讨论】:

  • 您应该提供您的实体和查询预期结果。您必须在查询中使用实体而不是数据库表

标签: hibernate jpa criteria-api


【解决方案1】:

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

【讨论】:

  • 我没有使用 spring Data (@Repository) 我正在使用旧的方式使用persistense Unit和entityManager来实现DAO逻辑
  • 如何创建查询? HQL、条件还是原生 SQL?
  • 我正在使用标准 API
猜你喜欢
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2013-07-12
  • 1970-01-01
相关资源
最近更新 更多