繁体   English   中英

使用nativeQuery = true在JPA Reposity中执行@Query时出现ResultSet错误

[英]ResultSet error executing @Query in JPA Reposity, using nativeQuery = true

我正在使用以下网络应用程序:

  • 春季启动
  • PostgreSQL的
  • JPA和Hibernate。

我有一个名为role的表和另一个page 其中有一个带有ID的many-to-many表。 我想要得到的是与角色对应的页面列表,所以我试图从角色的id中检索页面列表并执行查询以获取列表。 问题是我在ResultSet有一个错误,因为它告诉我它没有找到名为page_id的列。

示例:我已单独执行查询,这正确地为我带来了结果。

select p.url from role_page rp, page p where rp.role_id = 6 and rp.page_id = p.page_id;

输出: 查询的输出

然后我调用了函数来获取列表并检查它以确保我得到结果。

public void rolesAndPages(){
    List<Page> pages = pageRepository.findPagePerRole(6);
    for (Page page: pages
         ) {
        System.out.println(page.getUrl());
    }
}

并抛出上述错误:

org.postgresql.util.PSQLException: The column name page_id was not found in this ResultSet.

我的存储库:

@Repository("pageRepository")
public interface PageRepository extends JpaRepository<Page, Long> {
    @Query(value = "select p.url from role_page rp, page p where rp.role_id = ?1 and rp.page_id = p.page_id", nativeQuery = true)
    List<Page> findPagePerRole(Integer id);
} 

Role.java

@Entity
@Table(name = "app_role")
public class Role {
@Id
@SequenceGenerator(name="pk_sequence",sequenceName="messagesounds_id_seq", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="pk_sequence")
@Column(name="role_id")
private int id;
@Column(name="authority")
@NotEmpty(message = "*Please provide a name")
private String authority;

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "role_page", joinColumns = @JoinColumn(name = "role_id"), inverseJoinColumns = @JoinColumn(name = "page_id"))
private Set<Page> pages;

public void setPages(Set<Page> pages) {
    this.pages = pages;
}
public Set<Page> getPages() {
    return pages;
}

public Role() {}
public Role(String authority) {
    this.authority = authority;
}
public Role(String authority, Set<Page> pages){
    this.authority = authority;
    this.pages = pages;
}

public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
public String getAuthority() {
    return authority;
}
public void setAuthority(String authority) {
    this.authority = authority;
}
}

Page.java

@Entity
@Table(name = "page")
public class Page {
@Id
@SequenceGenerator(name = "pk_sequence", sequenceName = "messagesounds_id_seq", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "pk_sequence")
@Column(name = "page_id")
private int id;
@Column(name = "name_page")
@NotEmpty(message = "*Please provide a name")
private String name;
@Column(name = "url")
@NotEmpty(message = "*Please provide an url")
private String url;
@Column(name = "description")
@NotEmpty(message = "*Please provide a description")
private String description;

@ManyToMany(mappedBy = "pages")
private Set<Role> roles;


public Page() {
}

public Page(String name_page) {
    this.name = name_page;
}

public Page(String name_page, Set<Role> roles) {
    this.name = name_page;
    this.roles = roles;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getUrl() {
    return url;
}

public void setUrl(String url) {
    this.url = url;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public Set<Role> getRoles() {
    return roles;
}

public void setRoles(Set<Role> roles) {
    this.roles = roles;
}
}

你试过了吗:

@Query(value = "select p.url from role_page rp, page p where rp.id = ?1 and rp.id = p.id")

错误非常明显,您需要选择page_id列才能使其正常工作,而不仅仅是p.url

试试这个来检索Page的每一列:

@Query(value = "select p.* from role_page rp, page p where rp.role_id = ?1 and rp.page_id = p.page_id", nativeQuery = true)

或者,这将检索表Page和Role_Page的每一列:

@Query(value = "from role_page rp, page p where rp.role_id = ?1 and rp.page_id = p.page_id", nativeQuery = true)

两个查询都应该有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM