Java JPA实体和HQL连接命令

Java JPA实体和HQL连接命令,java,hibernate,jpa,Java,Hibernate,Jpa,我试图通过使用HQL和JPA实现下面类似sql命令的功能。 我需要选择对象(o),而不是“选择用户id…” 我对JPA DAO中的这部分代码有一些问题: public List<PosixUserEntity> listPosixUsers(final String uid_number) { final StringBuilder queryString = new StringBuilder("SELECT OBJECT(o) FROM "); queryString.

我试图通过使用HQL和JPA实现下面类似sql命令的功能。 我需要选择对象(o),而不是“选择用户id…”

我对JPA DAO中的这部分代码有一些问题:

public List<PosixUserEntity> listPosixUsers(final String uid_number) {


final StringBuilder queryString = new StringBuilder("SELECT OBJECT(o) FROM ");
   queryString.append(this.entityClass.getSimpleName());
   queryString.append(" o JOIN com.services.dao.user.jpa.UserEntity n ON (n.id=o.user_id) WHERE n.name LIKE :uid_number");

 final Query findByNameQuery = entityManager.createQuery(queryString.toString()).setParameter("uid_number", uid_number);

   return findByNameQuery.getResultList();
    }
公共列表listPosixUsers(最终字符串uid\U编号){
最终StringBuilder查询字符串=新StringBuilder(“从中选择对象(o));
append(this.entityClass.getSimpleName());
append(“o JOIN com.services.dao.user.jpa.UserEntity n ON(n.id=o.user_id),其中n.name类似于:uid_number”);
最终查询findByNameQuery=entityManager.createQuery(queryString.toString()).setParameter(“uid\U编号”,uid\U编号);
返回findByNameQuery.getResultList();
}
加入在这里是不允许的,我不知道如何替换它。 另外,如何用更干净的东西替换com.services.dao.user.jpa.UserEntity

还有我的实体,它们可能需要改进:

@Entity
@Table(name = "posix_user")
public class PosixUserEntity implements Serializable {
    private static final long serialVersionUID = 1L;

@Id
//@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private String user_id;

@Column(name = "uid_number")
private String uid_number;

@Column(name = "home_directory")
private String home_directory;

@Column(name = "login_shell")
private String login_shell;

@Column(name = "group_id")
private String group_id;

//getters,setters....

@Entity
@Table(name = "postgre_user")
@SQLDelete(sql = "update postgre_user set status = 'removed' where id = ?")
public class UserEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name", unique = true, nullable = false)
    private String name;

    @Column(name = "password")
    private String password;

    @Enumerated(EnumType.STRING)
    @Column(name = "status")
    private UserStatus status;

    @Column(name = "firstname")
    private String firstName;

    @Column(name = "lastname")
    private String lastName;

    @Column(name = "email")
    private String email;

    @Column(name = "usertype")
    private String userType;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
    private List<UserRoleTargetGroupEntity> userRoleTargetGroupEntity;

    @Column(name = "last_login")
    private String lastLogin;

    @Column(name = "previous_login")
    private String previousLogin;

    @JsonIgnore
    @Column(name = "change_password_flag")
    private Boolean userPasswordResetFlag;

    @OneToOne(cascade=CascadeType.ALL)
    @PrimaryKeyJoinColumn
    private PosixUserEntity posixUserEntity;
@实体
@表(name=“posix_用户”)
公共类PosixUserEntity实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
//@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“user\u id”)
私有字符串用户标识;
@列(name=“uid\u编号”)
私有字符串uid_编号;
@列(name=“home\u目录”)
私有字符串主目录;
@列(name=“login\u shell”)
私有字符串登录shell;
@列(name=“group\u id”)
私有字符串组标识;
//能手,二传手。。。。
@实体
@表(name=“postgre\u用户”)
@SQLDelete(sql=“更新postgre\u用户集状态='removed'其中id=?”)
公共类UserEntity实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@列(name=“name”,unique=true,nullable=false)
私有字符串名称;
@列(name=“password”)
私有字符串密码;
@枚举(EnumType.STRING)
@列(name=“status”)
私有用户状态;
@列(name=“firstname”)
私有字符串名;
@列(name=“lastname”)
私有字符串lastName;
@列(name=“email”)
私人字符串电子邮件;
@列(name=“usertype”)
私有字符串用户类型;
@OneToMany(cascade=CascadeType.ALL,mappedBy=“user”)
私有列表UserRoleTagetGroupEntity;
@列(name=“上次登录”)
私有字符串登录;
@列(name=“上一次登录”)
私有字符串previousLogin;
@杰索尼奥雷
@列(name=“更改密码\u标志”)
私有布尔userPasswordResetFlag;
@OneToOne(级联=级联类型.ALL)
@PrimaryKeyJoinColumn
私有PosixUserEntity PosixUserEntity;
您可能还需要知道,外键(用户id)引用postgre\u用户(id)-它应该是这样的


您知道如何修改我的选择吗?

我已经测试了您的类的简化版本

@Entity
@Table(name = "posix_user")
public class PosixUserEntity {

     @Id
     @Column(name = "user_id")
     private Long user_id;

     // getter + setter
}

@Entity
@Table(name = "postgre_user")
public class UserEntity {

     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;

     private String name;

     @OneToOne(cascade=CascadeType.ALL)
     @PrimaryKeyJoinColumn
     private PosixUser posixUserEntity;

     // getter + setter
}
这个JPQL查询工作正常

 String jpql = "SELECT p " 
              + "FROM UserEntity n JOIN n.posixUserEntity p " 
              + "WHERE n.name LIKE :uid_number)";
允许加入,因为您已在
UserEntity
中映射了关系。 您不需要指定实体类的完整名称。 在定义持久化单元时,检查它是否已包含在内


希望这有帮助。

我已经测试了您的类的简化版本

@Entity
@Table(name = "posix_user")
public class PosixUserEntity {

     @Id
     @Column(name = "user_id")
     private Long user_id;

     // getter + setter
}

@Entity
@Table(name = "postgre_user")
public class UserEntity {

     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;

     private String name;

     @OneToOne(cascade=CascadeType.ALL)
     @PrimaryKeyJoinColumn
     private PosixUser posixUserEntity;

     // getter + setter
}
这个JPQL查询工作正常

 String jpql = "SELECT p " 
              + "FROM UserEntity n JOIN n.posixUserEntity p " 
              + "WHERE n.name LIKE :uid_number)";
允许加入,因为您已在
UserEntity
中映射了关系。 您不需要指定实体类的完整名称。 在定义持久化单元时,检查它是否已包含在内


希望这能有所帮助。

您使用的是什么版本的Hibernate?加入不相关的实体是在5.1.0 org.jboss.as.jpa.Hibernate:4中添加的,但我无法更改。您不能在Hibernate 4.x中加入不相关的实体。您需要进行两次选择,或者在实体类中添加一个关系。您使用的是什么版本的Hibernate?加入不相关实体是在5.1.0 org.jboss.as.jpa.hibernate:4中添加的,但我无法更改它。在hibernate 4.x中,您不能在不相关实体之间加入。您需要进行两次选择,或者在我之前向实体类添加一个关系,即“私有长id”而不是“私有字符串id”。我用类似的方法测试,但我发现我父亲对Entites有问题。非常感谢。在我使用“私有长id”而不是“私有字符串id”之前,我用类似的方法测试,但我父亲对Entites有问题。非常感谢。