2014-02-04 3 views
3

У меня есть приложение для управления пользователями, которое выделяет каждому пользователю команду и один или многие доступ к различным приложениям. Теперь для страницы отчетности я пытаюсь извлечь данные из двух таблиц (UserInfo UserAppAccess) с помощью Hibernate, но я не могу. Вот таблицы:Как получить данные из нескольких запросов таблицы с помощью hibernate?

Таблица 1 (UserInfo):

@Entity 
@Table(name = "user_info", uniqueConstraints = { @UniqueConstraint(columnNames = "username"), @UniqueConstraint(columnNames = "email") }) 
public class UserInfo implements java.io.Serializable { 

    public enum UserStatus { 
     active, inactive 
    } 

    public enum UserType { 
     user, creator 
    } 

    private static final long serialVersionUID = 2650114334774359089L; 

    @Id 
    @Column(name = "id", unique = true, nullable = false, length = 100) 
    private String id; 

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

    @Column(name = "password", nullable = false, length = 80) 
    private String password; 

    @Column(name = "status", nullable = false, length = 10) 
    @Enumerated(EnumType.STRING) 
    private UserStatus status; 

    @Column(name = "type", nullable = false, length = 10) 
    @Enumerated(EnumType.STRING) 
    private UserType type; 

    @Column(name = "phone", nullable = true, length = 30) 
    private String phone; 

    @Column(name = "email", nullable = true, length = 50) 
    private String email; 

    @Column(name = "first_name", nullable = true, length = 50) 
    private String firstName; 

    @Column(name = "last_name", nullable = true, length = 50) 
    private String lastName; 

    @Column(name = "login", nullable = true, length = 100) 
    private long login; 

    @Column(name = "alert", nullable= true, length=500) 
    private String alert; 

    @OneToOne 
    @JoinColumn(name = "team_id") 
    private Team team; 
} 

Таблица 2 (команды):

@Entity 
@Table(name = "team", uniqueConstraints = { @UniqueConstraint(columnNames = "team_name"), @UniqueConstraint(columnNames = "team_code") }) 
public class Team implements java.io.Serializable { 

    private static final long serialVersionUID = 7933770163144650730L; 

    @Id 
    @Column(name = "id", unique = true, nullable = false, length = 80) 
    private String id; 

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

    @Column(name = "team_code", unique = true, nullable = false, length = 10) 
    private String code; 
} 

Таблица 3 (Доступ):

@Entity 
@Table(name = "access_def") 
public class Access implements java.io.Serializable { 

    private static final long serialVersionUID = 7933770163144650730L; 

    @Id 
    @Column(name = "id", unique = true, nullable = false, length = 80) 
    private String id; 

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

    @Column(name = "access_code", unique = true, nullable = false, length = 10) 
    private String code; 
} 

Таблица 4 (заявка):

@Entity 
@Table(name = "application", uniqueConstraints = { @UniqueConstraint(columnNames = "name") }) 

public class Application implements java.io.Serializable { 

    private static final long serialVersionUID = 5803631085624275364L; 

    @Id 
    @Column(name = "name", nullable = false, length = 100) 
    private String name; 
} 

Таблица 5 (UserAppAccess):

@Entity 
@Table(name = "user_app_access") 
@Embeddable 
public class UserAppAccess implements java.io.Serializable { 

    private static final long serialVersionUID = 7933770163144650730L; 

    @Id 
    @Column(name = "id", unique = true, nullable = false, length = 80) 
    private String id; 

    @OneToOne 
    @JoinColumn(name = "user_id") 
    private UserInfo userInfo; 

    @Column(name = "app_name", nullable = false, length = 100) 
    private String appName; 

    @OneToOne 
    @JoinColumn(name = "access_id") 
    private Access access; 
} 

У меня есть страница отчета, Администратор может выбрать несколько вариантов (например: список всех активных пользователей в тесте команды и приложения APP1).

вот мой код для извлечения данных, но он не работает:

public List<?> getReport(String teamId,String appName,UserStatus active,UserStatus inactive) { 
    Session session = sessionFactory.getCurrentSession(); 
    String hql = "SELECT u.firstName,u.username,u.status,u.lastName,u.phone,u.team From UserInfo u,AppAccess a WHERE u.status =? OR u.status =? AND u.team.id = ? AND a.appName = :appName "; 
    Query query = session.createQuery(hql); 
    query.setParameter(0, active); 
    query.setParameter(1, inactive); 
    query.setParameter(2, teamId); 
    query.setParameter("appName", appName); 
    System.out.println(query.list()); 
    return query.list(); 
} 

Например, когда я прохожу

  • Активные пользователи: Активные
  • неактивным Пользователь: неопределенные
  • команда: тест
  • приложение: app1

    TeamID: 28f66133-26c3-442b-a071-4d19d64ec0aeappName: app1active: activeinactive: нулевой

Я получаю это назад от моего return query.list();

[[Ljava.lang.Object;@2961116f, [Ljava.lang.Object;@23bfa3a2, [Ljava.lang.Object;@7a8ff303, [Ljava.lang.Object;@9b88d2, [Ljava.lang.Object;@6333934d, [Ljava.lang.Object;@4f0bd71c, [Ljava.lang.Object;@125797cf, [Ljava.lang.Object;@34afa071, [Ljava.lang.Object;@764e75bc, [Ljava.lang.Object;@1913c652, [Ljava.lang.Object;@61413e5a, [Ljava.lang.Object;@264b898, [Ljava.lang.Object;@22930462, [Ljava.lang.Object;@6204cfa9, [Ljava.lang.Object;@29dd9285, [Ljava.lang.Object;@11be6f3c, [Ljava.lang.Object;@6d78d53d, [Ljava.lang.Object;@17f7cff1, [Ljava.lang.Object;@e74e382, [Ljava.lang.Object;@1c047338, [Ljava.lang.Object;@68286fe6, [Ljava.lang.Object;@36ca9a76, [Ljava.lang.Object;@2f62d514, [Ljava.lang.Object;@1932c5a, [Ljava.lang.Object;@6544c984, [Ljava.lang.Object;@70a2d0d, [Ljava.lang.Object;@2d13b417, [Ljava.lang.Object;@6894691f, [Ljava.lang.Object;@6781a7dc, [Ljava.lang.Object;@7133919a] 
+0

Почему вы выбираете отдельные поля вместо «select User u from ...»? – radai

+0

вы получаете список объектов, что с этим не так? вы присоединяетесь к u и a в своем запросе? кажется, вы выбираете значения только из u, это предназначено? –

ответ

0

Добавляя LEFT JOIN FETCH или FETCH ALL PROPERTIES. Это заставит JOINS insteed ленивой инициализации

String hql = "SELECT u.firstName,u.username,u.status,u.lastName,u.phone,u.team From UserInfo u,AppAccess a FETCH ALL PROPERTIES WHERE u.status =? OR u.status =? AND u.team.id = ? AND a.appName = :appName "; 

Более подробную информацию можно найти в HQL Documentation

0

Во-первых: я надеюсь, что каждый из классов сущностей есть метод toString() (может быть автоматически сгенерирован с затмением), так что вы может распечатать их. Печать ссылки на объекты не достаточна для того, чтобы сделать вывод о том, получаете ли вы то, что хотите.

Во-вторых, синтаксис HQL присоединяется обычно так:

String queryString = "select distinct f from Foo f inner join foo.bars as b" + 
       " where f.creationDate >= ? and f.creationDate < ? and b.bar = ?"; 

(взято из How do you create a Distinct query in HQL)

+0

проблема в том, что есть четыре параметра и на основе этого я должен сгенерировать отчет. вот список параметров 1: всех активных пользователей, 2: список всех неактивных пользователей 3: список пользователей в приложении A, 4: список всех пользователей, связанных с командой X. пользователь может выбрать один или несколько параметров, и отчет должен быть создан на основе выбора. Теперь, если пользователь просто выберет 2: список всех неактивных, остальные три параметра будут нулевыми или пользователь может выбрать список всех активных пользователей в команде B и т. Д.. Можете ли вы дать мне SQL, который может обрабатывать этот сценарий – user3174407

1

Я предложил бы использовать родной SQL и JDBC для отчетов (см How should I use Hibernate Mapping while dealing with huge data table)

По соображениям эффективности желательно создать объекты модели представления из набора результатов прямо в DAO. Это может выглядеть как смешение уровней абстракции (уровень представления с уровнем персистентности), но это нормально, когда вам нужно получить большие объемы данных и не хотите делать ненужные преобразования объектов из моделей устойчивости для просмотра моделей.

Если вы хотите застрять с Hibernate, вы можете определить SYNTETIC объект и карту, если на вид, содержащий только необходимые столбцы из многообразны:

@Entity 
@Table("V_USER_REPORT") 
public class UserAppData { 
    // columns from table "user" 
    @Id 
    @Column(name = "id", unique = true, nullable = false, length = 100) 
    private String id; 
    @Column(name = "username", unique = true, nullable = false, length = 50) 
    private String username; 

    // columns from table "user" 
    @Column(name = "app_name", nullable = false, length = 100) 
    private String appName; 

    // columns from table "team" 
    @Column(name = "team_id", unique = true, nullable = false, length = 80) 
    private String team_id; 
    @Column(name = "team_name", unique = true, nullable = false, length = 100) 
    private String name; 
    @Column(name = "team_code", unique = true, nullable = false, length = 10) 
    private String code; 

    // and so on... 
} 

Тогда вы запрашиваете такой примитив параметрами, как вы делайте это с обычной сущностью.

Смежные вопросы