【问题标题】:Joining with cross-reference table in hibernate and spring在hibernate和spring中加入交叉引用表
【发布时间】:2014-06-30 10:33:57
【问题描述】:

我使用休眠和弹簧数据。有两个具有多对多关系的表。

@Entity
@Table(name = "FirstEntity")
public class FirstEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "first_entity_id")
    private Long id;

    @Column(name = "first_entiry_name")
    private String name;

    /* getters and setters are below*/
}

@Entity
@Table(name = "SecondEntity")
public class SecondEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "second_entity_id")
    private Long id;

    @Column(name = "second_entiry_name")
    private String name;

    @Column(name = "second_entiry_desc")
    private String description;

    /* getters and setters are below*/
}

以及用于交叉引用表的实体。

@Entity
@Table(name = "FirstSecondEntity")
public class FirstSecondEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "first_second_entity_id")
    private Long id;

    @Column(name = "first_entity_id")
    private Long firstEntityId;

    @Column(name = "second_entity_id")
    private Long secondEntityId;

    /* getters and setters are below*/
}

我需要这样的选择

SELECT FirstEntity.name, SecondEntity.name, SecondEntity.description FROM SecondEntity INNER JOIN FirstSecondEntity ON SecondEntity.id = FirstSecondEntity.secondEntityId INNER JOIN User ON FirstEntity.id = FirstSecondEntity.firstEntityId

即我需要来自交叉引用表的所有记录,而不是 ids,而是来自实体的实际信息。 将此查询插入到我的 CrudRepository 扩展类中的 @Query 注释中不起作用,因为

ERROR [main][org.hibernate.hql.internal.ast.ErrorCounter]  Path expected for join!

所以我需要你的帮助。

【问题讨论】:

    标签: java sql spring hibernate


    【解决方案1】:

    您的连接表完全搞砸了。在这种情况下,您实际上甚至不需要将连接表作为休眠映射:

    在第二个实体中添加以下列表:

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "FirstSecondEntity",
            joinColumns = {
                    @JoinColumn(name = "first_entity_id",
                            nullable = false,
                            updatable = false) },
            inverseJoinColumns = {
                    @JoinColumn(name = "second_entity_id",
                            nullable = false,
                            updatable = false) },
            )
    private List<FirstEntity> firstEntities;
    

    在 FirstEntity 中添加以下列表:

    @ManyToMany(fetch = FetchType.LAZY,
            mappedBy = "firstEntities")
    private List<SecondEntity> secondEntities;
    

    【讨论】:

    • 并且查询应该保持不变并添加到@Query注释中?如果是,我有例外。错误 [main][org.hibernate.hql.internal.ast.ErrorCounter] 预期加入的路径!引起:org.hibernate.QueryException:无法解析路径 [FirstEntity.name],意外令牌 [FirstEntity] [SELECT FirstEntity.name 作为 firstName,SecondEntity.name 作为 secondName,SecondEntity.description 作为描述 FROM SecondEntity INNER JOIN FirstSecondEntity ON SecondEntity .id = FirstSecondEntity.secondEntityId INNER JOIN User ON FirstEntity.id = FirstSecondEntity.firstEntityId]
    • 没有查询需要改,就是SQL查询,需要写HQL查询。您通常会返回实体对象。
    • 所以我应该创建一个包含必要字段的新实体以从查询中返回?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 2018-05-18
    • 2019-02-26
    • 2012-08-30
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多