Java JPA实体和HQL连接命令
我试图通过使用HQL和JPA实现下面类似sql命令的功能。 我需要选择对象(o),而不是“选择用户id…” 我对JPA DAO中的这部分代码有一些问题: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.
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有问题。非常感谢。