【发布时间】: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,以及Abc和Subscription之间的关系如何定义。