Spring Data JPA表联接创建运算符不存在错误



我有两个表,ProjectsTransitionAction。CCD_ 3和CCD_ 4都具有用于在它们之间执行联接的列CCD_。实体类如下:-

Project.java

@Entity
public class Project implements Serializable {
private static final long serialVersionUID = 1L;
@Id 
@SequenceGenerator(schema = "public", name="project_id_seq_gen",sequenceName="project_id_seq",initialValue=1,allocationSize=1)
@GeneratedValue(strategy= GenerationType.SEQUENCE,generator="project_id_seq_gen")   
private Integer id;
@Column(name = "request_no")
private String request_no;
@Column(name = "title")
private String title;
@Column(name = "department")
private String department;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "requestNo")
private Set<TransitionAction> tacts;
@ManyToOne
@JoinColumn(name = "status_id")
private Status status;
@ManyToOne
@JoinColumn(name = "level_id")
private ProjectLevel level;

TransitionAction.java

@Entity
@Table(name = "transitionaction")
public class TransitionAction implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "request_no")
private String request_no;
@Column(name = "actionDate")
private Date actionDate;

用于检索项目列表的代码如下:-

public interface UserInfoRepository extends JpaRepository<UserInfo, Long> {
UserInfo findByUserName(String userName);
@Query("SELECT project FROM Project project Join project.tacts pta where project.request_no= pta.request_no and project.status.id=1")
List<Project> getAllUserProjects();
}

我得到无法提取结果集错误。当我检查控制台时,我发现正在生成以下查询:

select
distinct project0_.id as id1_1_,
project0_.department as departme2_1_,
project0_.level_id as level_id6_1_,
project0_.user_nodal_officer as user_nod3_1_,
project0_.request_no as request_4_1_,
project0_.status_id as status_i7_1_,
project0_.title as title5_1_ 
from
project project0_ 
inner join
transitionaction tacts1_ 
on project0_.id=tacts1_.request_no

我不明白为什么项目。id与tact.request_no连接并创建错误

运算符不存在:integer=字符可变

因此,您希望通过requestNo 将所有TransitionAction链接到Project

您可以通过以下方式实现像这个一样在TransactionAction中添加@ManyToOne映射

@ManyToOne(fetch = FetchType.LAZY)
private Project project;

现在你需要像这个一样修改你的查询

@Query("SELECT project FROM Project project where project.status.id=1")
List<Project> getAllUserProjects();

获取给定项目的所有TransactionAction

Set<TransitionAction> allTatcts =  project.getTacts();

您不需要在查询中添加联接。一旦您通过一个实体从Project中提取TransactionAction,Hibernate就会处理这个问题。

编辑1:

但是为什么我的查询失败了?为什么项目主键与是否请求TransitionAction?

您的查询失败,因为在执行@OneTOMany关系时,您没有定义作为单向映射的@JoinColumn or @JoinTable

在这种情况下,Hibernate将使用primarykey列进行映射。

并且由于主键和列的类型不同,所以出现错误。

不描述任何物理映射(no@JoinColumn或@JoinTable(,使用单向的一对多联接表。这个表名是所有者表名_和另一侧表名称。引用所有者的外键名表是所有者表、_和所有者的串联主键列名称。引用另一边是所有者属性名称_和另一侧主键列名称。将向添加唯一约束外键引用另一侧的表以将该表反映到许多的

有关的更多详细信息,请参阅官方文档

@OneToMany
@JoinTable(
name="table_name",
joinColumns = @JoinColumn( name="columnname")
)
private Set<TransitionAction> tacts;

这是因为您的TransactionAction类中的request_no上有@Id,当您加入两个类时,它们就在主键上加入。

您可以改为使用交叉联接。

SELECT project FROM Project project, TransactionAction pta where project.request_no= pta.request_no and project.status.id=1

或者可以进行双向映射。在TransactionAction实体类中添加以下内容。

@ManyToOne
private Project Project;

然后您的查询将如下。

select pta.project from TransactionAction pta where pta.request_no=pta.project.request_no and pta.project.status.id=1

最新更新