当前位置: 首页 > 面试题库 >

在Spring Data JPA中联接两个表实体

欧博简
2023-03-14
问题内容

我想写一个查询SELECT * FROM Release_date_type a LEFT JOIN cache_media b on a.id=b.id。我是Spring Data JPA的新手。我不知道如何为Join查询编写实体。这是一个尝试:

@Entity
@Table(name = "Release_date_type")
public class ReleaseDateType {

    @Id
    @GeneratedValue(strategy=GenerationType.TABLE)
    private Integer release_date_type_id;
    // ...
    @Column(nullable = true) 
    private Integer media_Id;
    // with getters and setters...
}

另一个实体是:

@Entity
@Table(name = "Cache_Media")
public class CacheMedia {

    @Id
    @GeneratedValue(strategy=GenerationType.TABLE)
    private Integer id;
    // ...
    private Date loadDate; //with the getter and setter ..
}

我想写一个crudRepository诸如

public interface ReleaseDateTypeRepository extends CrudRepository<ReleaseDateType, Long>{
    @Query("SELECT * FROM Release_date_type a LEFT JOIN cache_media b on a.id=b.id")
    public List<ReleaseDateType> FindAllWithDescriptionQuery();
}

问题答案:

有关员工拥有一个或多个电话的典型示例,请参阅此Wikibook部分。

对于你的特定示例,如果你想建立one-to-one关系,则应更改ReleaseDateType模型中的下一个代码:

@Column(nullable = true) 
private Integer media_Id;

对于:

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="CACHE_MEDIA_ID", nullable=true)
private CacheMedia cacheMedia ;

在CacheMedia模型中,你需要添加:

@OneToOne(cascade=ALL, mappedBy="ReleaseDateType")
private ReleaseDateType releaseDateType;

然后应在你的存储库中替换:

@Query("Select * from A a  left join B b on a.id=b.id")
public List<ReleaseDateType> FindAllWithDescriptionQuery();

通过:

//In this case a query annotation is not need since spring constructs the query from the method name
public List<ReleaseDateType> findByCacheMedia_Id(Integer id); 

或通过:

@Query("FROM ReleaseDateType AS rdt WHERE cm.rdt.cacheMedia.id = ?1")    //This is using a named query method
public List<ReleaseDateType> FindAllWithDescriptionQuery(Integer id);

或者,如果你喜欢使用@OneToManyand @ManyToOne关系,则应在ReleaseDateType模型中更改下一个代码:

@Column(nullable = true) 
private Integer media_Id;

对于:

@OneToMany(cascade=ALL, mappedBy="ReleaseDateType")
private List<CacheMedia> cacheMedias ;

在CacheMedia模型中,你需要添加:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="RELEASE_DATE_TYPE_ID", nullable=true)
private ReleaseDateType releaseDateType;

然后应在你的存储库中替换:

@Query("Select * from A a  left join B b on a.id=b.id")
public List<ReleaseDateType> FindAllWithDescriptionQuery();

通过:

//In this case a query annotation is not need since spring constructs the query from the method name
public List<ReleaseDateType> findByCacheMedias_Id(Integer id); 

或通过:

@Query("FROM ReleaseDateType AS rdt LEFT JOIN rdt.cacheMedias AS cm WHERE cm.id = ?1")    //This is using a named query method
public List<ReleaseDateType> FindAllWithDescriptionQuery(Integer id);


 类似资料:
  • 问题内容: 我是新手,尝试过使用google,但无法解决我的查询。请帮忙。 我正在尝试在POJO类PersonC中映射两个实体:PersonA和Person 以上两个是jpa的实体。 现在,我想将它们合并为一个pojo类。 尝试下面的代码,但是当我尝试获取“地址/外键”字段时,它不起作用。 我应该在哪里为上面的哪个类定义@SqlResultSetMapping?)}) 问题答案: 可以放在 任何

  • 问题内容: 我有两个表: 我想从表1中选择所有具有值A和B的表2行的行。这将是行1和3(不是2行,因为它只有A,没有4行是因为只有B)。我可以在没有子查询的情况下执行此操作吗? (注意:我还需要查询表1中的值,因此我不能只查询表2。) 问题答案: 塔达阿!没有子查询。

  • 问题内容: 我正在尝试运行以下查询,但继续遇到相同的错误 查询失败错误:在第6行第33列遇到“”。 查询是: 从[Dataset1.1_0_MEMBER_GROUP]中 选择1_0_MEMBER_GROUP.User_Group, 1_0_MEMBER_GROUP.Member_ID, 1_4_MEMBER_TRAN_YEAR.MEMBER_UID 在1_0_MEMBER_GROUP_YEAR_M

  • 我有两张桌子, 我想为changelog实现一个搜索方法,该方法返回字段 如您所见,结果来自两个表的联接。 我发现https://gorm.io/docs/preload.html 但老实说,我不明白我该如何实现我所需要的。 我认为下面的内容可能会有所帮助 问题是,如何从GORM中提到的表格中获得我提到的内容?

  • 问题内容: 谁能告诉我如何编写查询并如上所述获取结果,谢谢!我试过加入,左右加入。一切都没有结果。 问题答案: 您可以在这两个表之间写左外部联接最好的理解方法是检查下图 查询您的要求 阅读有关 代码项目的 原始文章将对您有很大帮助:SQL Joins的可视表示 。 在以下位置找到原始版本:MySQL中的JOIN和OUTER JOIN之间的区别 。

  • 问题内容: 我有两个表的列相似-假设表A的列为LABEL_A,表B的列为LABEL_B。LABEL_A和LABEL_B的数据类型相同。 如何在单个查询中从两个表中选择LABEL?(因此,查询结果包含单个列LABEL,该列包含两个表的LABEL列中的数据)。 编辑:我可以在游标中使用这样的UNION查询吗? 感谢您的回答。 问题答案: 使用: 会更快,但是如果存在重复项,则不会删除重复项。如果要删除