2016-06-03 3 views
0

Я пытаюсь выполнить что-то вроде 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?

+0

Какую версию Hibernate вы используете? Присоединение несвязанных объектов было добавлено в 5.1.0, https://hibernate.atlassian.net/browse/HHH-16 – francis

+0

org.jboss.as.jpa.hibernate: 4, но я не могу его изменить. –

+0

Вы не можете соединяться между несвязанными объектами в Hibernate 4.x. Вам нужно либо сделать два выбора, либо добавить отношения к вашим классам Entity. – francis

ответ

2

Я проверил упрощенную версию ваших классов

@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. , и вам не нужно указывать полное имя вашего класса сущности. Проверьте, был ли он включен, когда вы определяете свой блок персистентности.

Надеюсь, это поможет.

+1

Ваше решение отлично работает! –

+1

Раньше у меня был «Частный длинный идентификатор» вместо «Private String id». Я тестировал аналогичный путь, но проблема с папой с Entites. Большое спасибо. –

+0

@ MichałWoźniczko Добро пожаловать. :-) – RubioRic