【问题标题】:JPQL many to many select queryJPQL 多对多选择查询
【发布时间】:2017-11-17 14:19:54
【问题描述】:

我有两个实体类和存储库如下所示。我正在做 jpql 选择查询。

Subscription.java

@Entity
@Table(name="Subscription")
public class Subscription implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="SubscriptionId", nullable=false)
    private Integer subscriptionId;

    @Column(name="BaseProductId", nullable=false)
    private Integer baseProductId;

    @ManyToMany(fetch = FetchType.LAZY, mappedBy="subscription")
    private List<Abc> abc;
}

Abc.java

@Entity
@Table(name="abc")
public class Abc implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="SubscriptionId", nullable=false)
    private Integer id;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinColumn(name="id", referencedColumnName="BaseProductId", insertable = false, updatable = false, nullable = false)
    private List<Subscription> subscription;
}

AbcRepository.java

@Repository
public interface AbcRepository extends JpaRepository<Abc, Integer> {

    @Query(value="SELECT bpp FROM Abc bpp JOIN bpp.subscription s WHERE s.subscriptionId = ?1")
        public List<Abc> findBppm(Integer a);
    }
}

选择查询生成:

select ... from abc bp_ inner join abc_subscription ... inner join Subscription subscripti2_ on ... where subscripti2_.SubscriptionId=?

... :- 这个地方有东西。

虽然我正在加入 abc 和订阅,但在查询休眠中创建了一个由 _ 分隔的实体。即 abc_subscription。

知道我做错了什么吗?提前致谢。

【问题讨论】:

  • 我不明白,这个查询有什么问题?你还有什么期待吗?你只是在乎名字吗?
  • 我期待查询:select ... from abc bp_ inner join Subscription subscripti2_ on ... where subscripti2_.SubscriptionId=?
  • 为什么会这样?您正在使用 ManyToMany 关系,因此默认情况下它将用连接表 Abc_subscription 表示。
  • 谢谢@chsdk,我不知道这个事实。我可以在我的情况下使用 manyToOne 吗?
  • 视情况而定,取决于你的design,以及AbcSubscription之间的关系如何定义。

标签: java hibernate jpa jpql


【解决方案1】:

@ManyToMany应该用于实体之间存在链接表的场景。

如果未指定@JoinTable,则持久性提供程序使用的默认链接表将是由“_”分隔的两个实体的串联。 最重要的是,f 未指定链接表中假定的列名将是实体类上定义的@Id 字段名。

尝试遵循规范并相应地调整您的情况:ManyToMany javadoc

【讨论】:

    【解决方案2】:

    通常,避免对多对多关系使用列表,因为这可能会在从任一实体中删除字段时导致问题。 而是使用 Sets private Set abc = new HashSet();

    【讨论】:

      猜你喜欢
      • 2016-07-08
      • 2012-09-07
      • 2013-09-06
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 2012-06-08
      相关资源
      最近更新 更多