选择多列unsing spring数据JPA和JPQL

时间:2017-10-10 11:34:37

标签: spring hibernate spring-data-jpa

我正在尝试选择两个独立表中的两列。一个表是用户,另一个表是权限。我需要从用户获取用户名,从privillages获取pname。我的模型类如下,

@Entity
@Table(name = "users")
public class Users implements Serializable{

 @Id
 @GeneratedValue(strategy = GenerationType.AUTO)
 private Integer id;
 public String username;
 public String password;
 public Integer privid;

 @OneToMany(cascade = CascadeType.ALL, mappedBy = "pid")
 private Collection<Privillages> priviJoin;

 public Integer getId() {
    return id;
 }
 public void setId(Integer id) {
   this.id = id;
 }
@Column(name = "username")
  public String getUsername() {
 return username;
}
public void setUsername(String username) {
   this.username = username;
 }
@Column(name = "password")
 public String getPassword() {
 return password;
 }
 public void setPassword(String password) {
 this.password = password;
}

@Column(name = "privid")
 public Integer getPrivid() {
return privid;
}
public void setPrivid(Integer privid) {
 this.privid = privid;
}

public Collection<Privillages> getPriviJoin() {
   return priviJoin;
}
public void setPriviJoin(Privillages priviJoin) {
   this.priviJoin = (Collection<Privillages>) priviJoin;
}

public Users() {
}
@Override
public String toString() {
  return String.format("Users[id=%d, username='%s', password='%s']", id, 
username, password);
}
}

Mu Privillages课程是,

@Entity
@Table(name = "privillages")
public class Privillages implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer id;

public String pname;


@ManyToOne(optional = false)
@JoinColumn(name = "pid", referencedColumnName = "privid")
public Users pid;

public Integer getId() {
  return id;
}
public void setId(Integer id) {
this.id = id;
}

@Column(name = "pname")
 public String getPname() {
 return pname;
}
public void setPname(String pname) {
   this.pname = pname;
}

@Column(name = "pid")
 public Users getPid() {
 return pid;
}
public void setPid(Users pid) {
 this.pid = pid;
}

public Privillages(){
} 
}

我的用户资料库是,

public interface UsersRepository extends CrudRepository<Users, Integer> 
{
    @Query("select u from Users ug join ug.priviJoin u")
    List<Users> findByUsername();
}

我的Privillage存储库是,

public interface PrivillagesRepository extends CrudRepository<Privillages, 
Integer> {

 }

我的控制器文件是,

@RequestMapping(value = "/joinResult", method = RequestMethod.GET)
public ModelAndView joinResultShow(Model model)
{
List<Privillages> privillages = (List<Privillages>)privillagesRepo.findAll();
model.addAttribute("joinData",privillages);
ModelAndView viewObj = new ModelAndView("fleethome");
return viewObj;
}

并显示如,

<table>
    <tr th:each="message : ${joinData}">
        <td th:text="${message.pname}"></td>
        <td th:text="${message.pid.username}"></td>
    </tr>
</table>

收到错误消息“出现意外错误(类型=内部服务器错误,状态= 500)。 没有可用的消息“。

Stacktrace是,

java.lang.NullPointerException: null
at 
com.central.controller.WebController.joinResultShow(WebController.java:58) ~
[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~
[na:1.8.0_141]
at sun.reflect.NativeMethodAccessorImpl.invoke
(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_141]
at sun.reflect.DelegatingMethodAccessorImpl.
invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_141]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_141]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke
(InvocableHandlerMethod.java:205) ~[spring-web-
4.3.11.RELEASE.jar:4.3.11.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.
invokeForRequest(InvocableHandlerMethod.java:133) ~[spring-web-
4.3.11.RELEASE.jar:4.3.11.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.
ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.
java:97) ~[spring-webmvc-4.3.11.RELEASE.jar:4.3.11.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.
RequestMappingHandlerAdapter.invokeHandlerMethod
(RequestMappingHandlerAdapter  .java:827) 
~[spring-webmvc-4.3.11.RELEASE.jar:4.3.11.RELEASE]
at org.springframework.web.servlet.mvc.method.
annotation.RequestMappingHandlerAdapter.handleInternal
(RequestMappingHandlerAdapter.java:738) ~[spring-webmvc-
4.3.11.RELEASE.jar:4.3.11.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.
handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-
4.3.11.RELEASE.jar:4.3.11.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.
doDispatch(DispatcherServlet.java:967) ~[spring-webmvc-
4.3.11.RELEASE.jar:4.3.11.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService
(DispatcherServlet.java:901) ~[spring-webmvc-
4.3.11.RELEASE.jar:4.3.11.RELEASE]

实际上我需要从用户检索用户名,从privillages检索pname列。我需要如何更改我的代码?我在这方面做了很多尝试。任何人都可以帮我解决这个关联问题吗?

2 个答案:

答案 0 :(得分:0)

首先,您应该创建privillages存储库:

didSelectItem(:_)

然后你可以在你的控制器中找到所有的权限:

public interface PrivillagesRepository extends CrudRepository<Privillages, Integer> {
}

之后,更改模板:

List<Privillages> privillages = privillages.findAll();
model.addAttribute("joinData",privillages);

如您所见,要打印用户名,您需要使用嵌套字段“pid”(用户类)

答案 1 :(得分:0)

我刚刚探讨了上下文,使用与Userrepository相同的存储库以及JPQL查询。并使用Privillages Model类中的pid根据显示用户名的方式修改视图文件。我添加的代码需要修改一些更改。

我的控制器文件是,

UsersRepository userRepo;
@RequestMapping(value = "/joinResult", method = RequestMethod.GET)
    public ModelAndView joinResultShow(Model model)
        {
            List<Users> use = (List<Users>) userRepo.findByUsername();
            model.addAttribute("joinData",use);
            ModelAndView viewObj = new ModelAndView("fleethome");
            return viewObj;
        }

和存储库,

public interface UsersRepository extends CrudRepository<Users, Integer> 
{
    Users findByUsernameAndPassword(String username,String password);   

    @Query("select u from Users ug join ug.priviJoin u")
    List<Users> findByUsername();

}

我的Privillage存储库,

public interface PrivillagesRepository extends CrudRepository<Privillages, 
Integer> {

}

使用

修改View文件
<table>
        <th> Username </th>
        <th> Privillage Name </th>
            <tr th:each="message : ${joinData}">
                <td th:text="${message.pid.username}"></td>
                <td th:text="${message.pname}"></td>
            </tr>
    </table>