Я пытаюсь выполнить что-то вроде sql-команды ниже, используя HQL и JPA. Вместо «SELECT user_id ...» мне нужен SELECT OBJECT (o).Команда JPA Entity и HQL JOIN
SELECT user_id FROM posix_user o INNER JOIN postgre_user n ON n.id=o.user_id WHERE n.name='USERNAME2'
У меня есть некоторые проблемы с этой частью коды в 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();
}
РЕГИСТРИРУЙТЕСЬ НА не allowet здесь, и я не знаю, как заменить его. Также как я могу заменить com.services.dao.user.jpa.UserEntity чем-то более чистым.
Существует мои Entites, они, возможно, должны быть улучшены:
@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;
Вы можете также должны знать, что FOREIGN KEY (user_id) ЛИТЕРАТУРЫ postgre_user (ID) - он должен выглядеть, что
Вы знаете, как я могу изменить свой SELECT?
Какую версию Hibernate вы используете? Присоединение несвязанных объектов было добавлено в 5.1.0, https://hibernate.atlassian.net/browse/HHH-16 – francis
org.jboss.as.jpa.hibernate: 4, но я не могу его изменить. –
Вы не можете соединяться между несвязанными объектами в Hibernate 4.x. Вам нужно либо сделать два выбора, либо добавить отношения к вашим классам Entity. – francis