![](/img/trans.png)
[英]ERROR: operator does not exist : boolean = bytea in spring jpa query and postgres
[英]Spring Data JPA table join creating operator does not exist error
我有两个表Projects
和TransitionAction
。 Projects
和TransitionAction
都具有一列request_no
,用于在它们之间执行request_no
。 实体类如下:
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();
}
我无法提取ResultSet错误。 当我检查控制台时,发现正在生成以下查询:
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结合并创建错误
运算符不存在:整数=字符变化
这是因为您在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
因此,您希望通过requestNo链接到Project的所有TransitionAction
您可以通过像这样在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的request_no连接?
您的查询失败,因为在进行@OneTOMany
关系时,您未定义@JoinColumn or @JoinTable
这是一个单向映射。
在这种情况下,Hibernate将使用primarykey列进行映射。
而且由于主键和列的类型不同,因此会出现错误。
在不描述任何物理映射(没有@JoinColumn或@JoinTable)的情况下,使用单向一对多连接表。 表名是所有者表名_和另一方表名的串联。 引用所有者表的外键名称是所有者表_和所有者主键列名称的串联。 引用另一侧的外键名称是所有者属性名称_和另一侧主键列名称的串联。 唯一约束被添加到引用另一边表的外键上,以反映一对多关系。
有关更多详细信息,请参考官方文档
@OneToMany
@JoinTable(
name="table_name",
joinColumns = @JoinColumn( name="columnname")
)
private Set<TransitionAction> tacts;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.