JPAReposiry 获取所有对象而不是我想要的对象
JPAReposiry fetch all the object instead the one I want
我需要从 sql 获取通道为真 (1) 的位置,但是当我在 JPARepository 上执行相同的查询时,它会从许多 table 中获取所有行
我对 sql 的查询是这样的::
select * FROM tbl_archive A JOIN tbl_channel C ON(C.ARCHIVE_ID =A.ARCHIVE_ID)
WHERE a.identifier='NGLCRS97D12G866L' AND c.ENABLED_CHANNEL=1
我得到了这个结果(我想要这个):
when I try to do this on JPARepository:
@Query(value = "select * FROM TBL_ARCHIVE A JOIN TBL_CHANNEL C ON(C.ARCHIVE_ID =A.ARCHIVE_ID) " +
"WHERE a.identifier= :identifier AND c.ENABLED_CHANNEL=1", nativeQuery = true)
Page<Archive> findChannelEnabled(@Param("identifier") String identifier, Pageable pageable);
我在 json 结果中得到了这个:
但我不需要 where is false。
我也尝试了这个查询,但没有任何改变,当获取结果时,它将获取与存档(一个)有关系的所有频道(很多)
Page<Archive> findByIdentifierAndChannelsEnabledChannelTrue(String identifier, Pageable pageable);
我的模特是这些:
public class Archive {
@Id
@Column(name = "ARCHIVE_ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Generated(GenerationTime.ALWAYS)
private Long archiveId;
@Column(name = "IDENTIFIER")
private String identifier;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "archive")
@JsonManagedReference
private Set<Channel> channels;
}
public class Channel {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Generated(GenerationTime.ALWAYS)
private Long channelId;
@ManyToOne
@JoinColumn(name = "archive_id")
@JsonBackReference
private Archive archive;
@Column(name = "Channel_Name")
private String channelName;
@Column(name = "ENABLED_CHANNEL")
private Boolean enabledChannel;
}
我的服务:
public Page<Archive> getChannelEnabled(String identifier) {
return archiveRepo.findChannelEnabled(identifier, PageRequest.of(0, 10));
}
尝试使用 NumericBooleanType,根据定义,映射在 INTEGER
和 Boolean
之间(使用 1
和 0
).
@Column(name = "ENABLED_CHANNEL")
@Type(type = "org.hibernate.type.NumericBooleanType")
private Boolean enabledChannel;
您可以像这样修改存储库方法来做到这一点:
@Query(value = "select a FROM Archive a join fetch a.channels c where a.identifier=:identifier and c.enabledChannel=1",
countQuery = " select count(a) from Archive a left join a.channels where a.identifier=:identifier")
Page<Archive> findChannelEnabled(@Param("identifier") String identifier, Pageable pageable);
我需要从 sql 获取通道为真 (1) 的位置,但是当我在 JPARepository 上执行相同的查询时,它会从许多 table 中获取所有行 我对 sql 的查询是这样的::
select * FROM tbl_archive A JOIN tbl_channel C ON(C.ARCHIVE_ID =A.ARCHIVE_ID)
WHERE a.identifier='NGLCRS97D12G866L' AND c.ENABLED_CHANNEL=1
我得到了这个结果(我想要这个):
when I try to do this on JPARepository:
@Query(value = "select * FROM TBL_ARCHIVE A JOIN TBL_CHANNEL C ON(C.ARCHIVE_ID =A.ARCHIVE_ID) " +
"WHERE a.identifier= :identifier AND c.ENABLED_CHANNEL=1", nativeQuery = true)
Page<Archive> findChannelEnabled(@Param("identifier") String identifier, Pageable pageable);
我在 json 结果中得到了这个:
但我不需要 where is false。 我也尝试了这个查询,但没有任何改变,当获取结果时,它将获取与存档(一个)有关系的所有频道(很多)
Page<Archive> findByIdentifierAndChannelsEnabledChannelTrue(String identifier, Pageable pageable);
我的模特是这些:
public class Archive {
@Id
@Column(name = "ARCHIVE_ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Generated(GenerationTime.ALWAYS)
private Long archiveId;
@Column(name = "IDENTIFIER")
private String identifier;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "archive")
@JsonManagedReference
private Set<Channel> channels;
}
public class Channel {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Generated(GenerationTime.ALWAYS)
private Long channelId;
@ManyToOne
@JoinColumn(name = "archive_id")
@JsonBackReference
private Archive archive;
@Column(name = "Channel_Name")
private String channelName;
@Column(name = "ENABLED_CHANNEL")
private Boolean enabledChannel;
}
我的服务:
public Page<Archive> getChannelEnabled(String identifier) {
return archiveRepo.findChannelEnabled(identifier, PageRequest.of(0, 10));
}
尝试使用 NumericBooleanType,根据定义,映射在 INTEGER
和 Boolean
之间(使用 1
和 0
).
@Column(name = "ENABLED_CHANNEL")
@Type(type = "org.hibernate.type.NumericBooleanType")
private Boolean enabledChannel;
您可以像这样修改存储库方法来做到这一点:
@Query(value = "select a FROM Archive a join fetch a.channels c where a.identifier=:identifier and c.enabledChannel=1",
countQuery = " select count(a) from Archive a left join a.channels where a.identifier=:identifier")
Page<Archive> findChannelEnabled(@Param("identifier") String identifier, Pageable pageable);