我需要SELECT
在@QUERY
. 也許我誤解了檔案中寫的資訊。我的查詢如下所示:
@Query("select massages.id from massages join string_massage on massages.id = string_massage.massage_id where string_massage.string_id = ?1")
List<MasageEntity> findMassagesIdByStringId(@Param("strings_id") long strings_id);
在我的示例中,我使用表名。名稱帶下劃線表示錯誤(未編譯)。也許我應該使用物體。那么我該如何處理多對多關系呢?
我將展示我的物體的一部分。
我有兩個物體。MasageEntity
和RstringEntity
。
//MasageEntity
@Entity
@Table(name = "massages")
public class MasageEntity {
@Id
@GeneratedValue (strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "string_text")
private String string_text;
@Column(name = "string_speed")
private Long string_speed;
@Column(name = "string_color_type")
private Long string_color_type;
@Column(name = "string_color")
private String string_color;
@Column(name = "string_timing_type")
private String string_timing_type;
@Column(name = "string_timing")
private String string_timing;
@Column(name = "showed")
private Long showed;
@ManyToMany(fetch = FetchType.LAZY,
cascade = {
CascadeType.PERSIST,
CascadeType.MERGE
})
@JoinTable(name = "string_massage",
joinColumns = { @JoinColumn(name = "massage_id") },
inverseJoinColumns = { @JoinColumn(name = "string_id") })
//RstringEntity
@Entity
@Table(name = "string")
public class RstringsEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@Column(name="code")
private String code;
@ManyToMany(fetch = FetchType.LAZY,
cascade = {
CascadeType.PERSIST,
CascadeType.MERGE
}, mappedBy = "strings")
@JsonIgnore
private Set<MasageEntity> masagess = new HashSet<>();
public RstringsEntity() {}
uj5u.com熱心網友回復:
在 Spring Boot 中執行查詢有多種方式:原生 SQL 和 JPQL。
對于本機查詢,我們使用純 SQL 語言,在 DB 級別定義查詢。
在 Java 持久性查詢語言 (JPQL) 的情況下,我們通過物體物件定義查詢。
解決方案 1,本機查詢
您在存盤庫中創建了本機查詢,但要使用它,我們需要將其標記為 SQL nativeQuery = true
。框架需要了解您使用的查詢語言。@Query
注釋默認使用JPQL,所以這就是你錯誤的原因。
@Repository
public interface MessageRepository extends JpaRepository<MassageEntity, Long> {
//find MessageEntities by String ID via native query
@Query(value = "select massages.* from massages join string_massage on massages.id = string_massage.massage_id where string_massage.string_id = ?1", nativeQuery = true)
List<MassageEntity> findMassagesByStringIdNativeSQL(@Param("strings_id") long strings_id);
//find Message IDs by String ID via native query
@Query(value = "select massages.id from massages join string_massage on massages.id = string_massage.massage_id where string_massage.string_id = ?1", nativeQuery = true)
List<Long> findMassagesIdByStringIdNativeSQL(@Param("strings_id") long strings_id);
}
解決方案 2,JPQL 查詢
示例如何為您的案例定義 JPQL 查詢。JPQL 在執行程序中會被翻譯成 SQL。
@Repository
public interface MessageRepository extends JpaRepository<MassageEntity, Long> {
//find MessageEntities by String ID via JPQL
@Query("select message from MassageEntity message join message.strings string where string.id = :strings_id")
List<MassageEntity> findMassagesByStringIdJPQL(@Param("strings_id") long strings_id);
//find Message IDs by String ID via JPQL
@Query("select message.id from MassageEntity message join message.strings string where string.id = :strings_id")
List<Long> findMassagesIDByStringIdJPQL(@Param("strings_id") long strings_id);
}
Hibernate 生成的本機查詢:
select
massageent0_.id as id1_3_,
massageent0_.string_text as string_t2_3_
from
massages massageent0_
inner join
string_massage strings1_
on massageent0_.id=strings1_.massage_id
inner join
string rstringsen2_
on strings1_.string_id=rstringsen2_.id
where
rstringsen2_.id=?
方案三、Spring自動生成查詢
Spring可以通過repository方法定義自動生成查詢。
您的案例示例:
@Repository
public interface MessageRepository extends JpaRepository<MassageEntity, Long> {
//find MessageEntities by String ID
List<MassageEntity> findByStrings_Id(@Param("id") long strings_id);
}
我用于解決方案的條目:
@Entity
@Table(name = "massages")
public class MassageEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "string_text")
private String string_text;
@ManyToMany(fetch = FetchType.LAZY,
cascade = {
CascadeType.PERSIST,
CascadeType.MERGE
})
@JoinTable(name = "string_massage",
joinColumns = { @JoinColumn(name = "massage_id") },
inverseJoinColumns = { @JoinColumn(name = "string_id") })
private Set<RstringsEntity> strings = new HashSet<>();
}
@Entity
@Table(name = "string")
public class RstringsEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@Column(name = "code")
private String code;
@ManyToMany(fetch = FetchType.LAZY,
cascade = {
CascadeType.PERSIST,
CascadeType.MERGE
}, mappedBy = "strings")
@JsonIgnore
private Set<MassageEntity> massages = new HashSet<>();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/471005.html