Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate简单的一对多查询无限查询_Hibernate_Jpa_Criteria Api - Fatal编程技术网

Hibernate简单的一对多查询无限查询

Hibernate简单的一对多查询无限查询,hibernate,jpa,criteria-api,Hibernate,Jpa,Criteria Api,我有以下表格结构:用户、对话框、消息。用户拥有对话框列表和消息列表。对话框包含用户列表和消息列表。消息引用了对话框和用户。所以 用户-对话框:多对多 消息-用户:多对一 消息-对话框多对一 实体: 对话框 我的实体管理器查询 ……等等 我知道我有多个引用,一个实体引用另一个实体,但所有的抓取都是惰性的。你们也可以认为问题出在hashCode、equals或toString方法中,它们并没有对其他实例的任何引用(只有自己的字段) 我不排除我在实体声明中的某个地方弄错了 您可以在您的对话框实体中将J

我有以下表格结构:用户、对话框、消息。用户拥有对话框列表和消息列表。对话框包含用户列表和消息列表。消息引用了对话框和用户。所以

用户-对话框:
多对多

消息-用户:
多对一

消息-对话框
多对一

实体:

对话框

我的实体管理器查询

……等等

我知道我有多个引用,一个实体引用另一个实体,但所有的抓取都是惰性的。你们也可以认为问题出在hashCode、equals或toString方法中,它们并没有对其他实例的任何引用(只有自己的字段)

我不排除我在实体声明中的某个地方弄错了

您可以在您的
对话框
实体中将Jackson's与
dialogUsers
列表一起使用,这将防止Hibernate在选择
对话框
时获取用户列表:

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "dialogs_users",
        joinColumns = @JoinColumn(name = "id_dialog"),
        inverseJoinColumns = @JoinColumn(name = "id_user"))
@JsonIgnore
private List<User> dialogUsers;
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name=“dialogs\u用户”,
joinColumns=@JoinColumn(name=“id\u dialog”),
inverseJoinColumns=@JoinColumn(name=“id\u user”))
@杰索尼奥雷
私人用户名单;

我刚试过。它不会影响我的无限循环,为什么我需要在hibernate知道它是懒惰的并且我没有提到它的时候指定它呢?就像发布堆栈跟踪。。。
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_user")
    private Long id;

    @NotNull
    @Column(name = "full_name")
    private String fullName;

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

    @NotNull
    @Column(name = "active")
    private boolean active;

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

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user")
    private List<Message> messages;

    @ElementCollection(targetClass = Role.class)
    @CollectionTable(name = "user_roles",
            joinColumns = @JoinColumn(name = "user"))
    @Column(name = "role")
    @Enumerated(EnumType.ORDINAL)
    private List<Role> roles = new ArrayList<>();

    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "dialogUsers")
    private List<Dialog> dialogs = new ArrayList<>();

    //default constructor and getters setters and hashCode equals toString
}
@Entity
@Table(name = "messages")
public class Message {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_message")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_dialog")
    private Dialog dialog;

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

    @Column(name = "date_time")
    private LocalDateTime dateTime;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_user")
    private User user;

    //default constructor and getters setters and hashCode equals toString
}
@Override
public List<Message> findMessagesByDialog(Long dialogId) {
    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<Message> criteria = builder.createQuery(Message.class);
    Root<Dialog> dialog = criteria.from(Dialog.class);

    Join<Dialog, Message> messages = dialog.join(Dialog_.messages);

    criteria.select(messages).where(builder.equal(dialog.get(Dialog_.id), dialogId));
    return entityManager.createQuery(criteria).getResultList();
}
Hibernate: 
    select
        messages1_.id_message as id_messa1_2_,
        messages1_.date_time as date_tim2_2_,
        messages1_.id_dialog as id_dialo4_2_,
        messages1_.id_user as id_user5_2_,
        messages1_.value as value3_2_ 
    from
        dialogs dialog0_ 
    inner join
        messages messages1_ 
            on dialog0_.id_dialog=messages1_.id_dialog 
    where
        dialog0_.id_dialog=1
Hibernate: 
    select
        dialog0_.id_dialog as id_dialo1_0_0_,
        dialog0_.dialog_name as dialog_n2_0_0_ 
    from
        dialogs dialog0_ 
    where
        dialog0_.id_dialog=?
Hibernate: 
    select
        user0_.id_user as id_user1_4_0_,
        user0_.active as active2_4_0_,
        user0_.email as email3_4_0_,
        user0_.full_name as full_nam4_4_0_,
        user0_.password as password5_4_0_ 
    from
        users user0_ 
    where
        user0_.id_user=?
Hibernate: 
    select
        user0_.id_user as id_user1_4_0_,
        user0_.active as active2_4_0_,
        user0_.email as email3_4_0_,
        user0_.full_name as full_nam4_4_0_,
        user0_.password as password5_4_0_ 
    from
        users user0_ 
    where
        user0_.id_user=?
Hibernate: 
    select
        dialoguser0_.id_dialog as id_dialo1_1_0_,
        dialoguser0_.id_user as id_user2_1_0_,
        user1_.id_user as id_user1_4_1_,
        user1_.active as active2_4_1_,
        user1_.email as email3_4_1_,
        user1_.full_name as full_nam4_4_1_,
        user1_.password as password5_4_1_ 
    from
        dialogs_users dialoguser0_ 
    inner join
        users user1_ 
            on dialoguser0_.id_user=user1_.id_user 
    where
        dialoguser0_.id_dialog=?
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "dialogs_users",
        joinColumns = @JoinColumn(name = "id_dialog"),
        inverseJoinColumns = @JoinColumn(name = "id_user"))
@JsonIgnore
private List<User> dialogUsers;