[英]How to write query on many to many association table
我有2个实体,并且它们之间有多对多关系。 我想在关联表上写一个查询。
Here are the two entities. Craftsmen and Skill.
I want to write a query which selects all Craftsmen with a given skill.
@Entity
@Table(name = "craftsman")
public class Craftsman {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToMany
@JoinTable(name = "craftman_skill", joinColumns = @JoinColumn(name = "craftman_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "skill_id", referencedColumnName = "id"))
private List<Skill> skillList;
}
@Entity
@Table(name = "skill")
public class Skill {
@ManyToMany(mappedBy = "skillList")
@JsonBackReference
private List<Craftsman> craftmanList;
}
这是我尝试过的:
@Query("SELECT c FROM Craftsman c JOIN c.skillList sl WHERE c.skillList.skill_id = :skillId")
public List<Craftsman> getCraftsmanBySkill(@Param("skillId") Long skillId);
这是在MySql中工作的查询:这将使所有具有ID 1技能的工匠:
select c.name from craftsman c, craftman_skill cs
where cs.craftman_id = c.id
and cs.skill_id = 1;
这是我得到的错误:
Caused by: java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: skill_id of: com.craftsmen.crafts.persistence.Skill [SELECT c FROM com.craftsmen.crafts.persistence.Craftsman c JOIN c.skillList sl WHERE c.skillList.skill_id = :skillId ]
Caused by: org.hibernate.QueryException: could not resolve property: skill_id of: com.craftsmen.crafts.persistence.Skill [SELECT c FROM com.craftsmen.crafts.persistence.Craftsman c JOIN c.skillList sl WHERE c.skillList.skill_id = :skillId ]
我想问题是,您的Skill
实体确实没有skill_id或更好的id
。
您是否尝试给您的Skill
实体提供id
@Entity
@Table(name = "skill")
public class Skill {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToMany(mappedBy = "skillList")
@JsonBackReference
private List<Craftsman> craftmanList;
}
在您的Craftsman
实体中引用它
@Entity
@Table(name = "craftsman")
public class Craftsman {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToMany
@JoinTable(name = "craftman_skill", joinColumns = @JoinColumn(name = "craftman_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "skill_id", referencedColumnName = "id"))
private List<Skill> skillList;
}
然后将Query
更改为
SELECT c FROM Craftsman c JOIN c.skillList sl WHERE sl.id = :skillId
这应该够了吧。
您也可以在这里考虑使用JpaRepository的选项:
public interface CraftsmanRepository extends JpaRepository<Craftsman, String> {
public List<Craftsman> getBySkillListIn(@NotEmpty List<Skill> skillList);
}
这意味着,Jpa通过编写方法名称已经将该查询映射到您的SQL查询(如果没有,请尝试)
并且在方法末尾,“ In”表示不应检查一个值,而应检查多个值
在SQL中, In
也可以正常工作,并且可以执行以下操作:
where <condition> And <>condition And <condition> And...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.