当前位置: 首页 > 知识库问答 >
问题:

如何使用Hibernate延迟加载可以为空的列

汪安然
2023-03-14

这是我的实体:

@Entity
@Table(name = "users")
public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

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

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


@ManyToOne(fetch = FetchType.LAZY, cascade=CascadeType.MERGE)
@JoinColumn(name = "id_city")
private City city;
//...

}

在我的存储库中,我有:

public interface UserRepository extends JpaRepository<User, Long>{

@Query("SELECT u FROM User u JOIN FETCH u.city")
public List<User> findAllUserForApi();

}

如果表中有任何城市,findAllUserForApi()会显示用户的全部信息:

[{"id":1,"name":"John","surname":"Pillman","city":{"id":1,"name":"New York"}]

如果没有城市,我想至少得到[{"id": 1,"name":"John","surname":"Pillman","city": null]但我什么都没有:[]

请帮帮我。

共有3个答案

楚举
2023-03-14

看起来您正试图使用带有预定义查询的懒惰加载,我不认为这会起作用。

请参阅,查询中的连接获取状态如下:

获取所有拥有u.City的用户

所以如果你没有u。City对于用户来说,返回将为空。

更多关于JoinFetch的信息

你真正想要的是:

public User findUserByID(Long userId)
{
    Session session = sessionFactory.getCurrentSession();  

    User user = (Users) session.createCriteria(User.class).add(Restrictions.idEq(userId)).uniqueResult();  

    // this will force SQL to execute the query that will join with the user's city and populate  
    //  the appropriate information into the user object.  
    Hibernate.initialize(user.geCity());  

    return user;  
}  

如果u.CityNULL,它将返回NULL。而用户对象包含数据。

或者在您的情况下,查找所有用户:

public List<User> findUserByID(Long userId)
{
    Session session = sessionFactory.getCurrentSession();  

    List<User> users = (List<User>) session.createCriteria(User.class);

    // this will force SQL to execute the query that will join with the user's city and populate  
    //  the appropriate information into the user object.  

    for (User user : users)
        Hibernate.initialize(user.geCity());  

    return user;  
}  

注意:我没有测试代码,这是伪代码,因此您可能需要更改其中一些。

来源

单于善
2023-03-14

为什么要在这里编写自定义查询。你不需要。

首先,你必须遵循一般惯例:

@ManyToOne(fetch = FetchType.LAZY, cascade=CascadeType.MERGE)
@JoinColumn(name = "CITY_ID")
private City city;
...

这里JPA显示了与用户相关的所有信息。

public interface UserRepository extends JpaRepository<User, Long>{
    public List<User> findAll();
}
雍骏俊
2023-03-14

考虑到您已经在使用自定义查询,最简单的解决方案是左连接获取:@query(“从用户u左连接获取u.city中选择u”)这样,所有用户都将被加载,无论他们是否有城市;对于那些拥有城市的人来说,用户可以使用它。getCity()

 类似资料:
  • 问题内容: 使用Hibernate和lazy = true模式从数据库加载对象列表时遇到了一些麻烦。希望有人可以在这里帮助我。 我这里有一个称为UserAccount的简单类,它看起来像这样: 我正在通过以下映射文件在Hibernate中映射此类: 如您所见,在bag映射元素中,lazy设置为“ true”。 将数据保存到数据库可以正常工作: 通过调用也可以加载(请参见下面的代码): 问题只是:当

  • 我面临的问题是一对一的惰性加载在Hibernate中不起作用。我已经解决了,但还是不明白会发生什么。 我的代码(懒惰加载在这里不起作用,当我拉person-address也被提取): 但是:如果我在OneToOne关系中添加,那么惰性加载工作很好! 问题/恳求:请给我解释一下注释如何帮助实现延迟加载。 附注。我看过post1和post2,明白了为什么简单的OneToOne不能偷懒,但我还是不能掌握

  • 问题内容: 我正在使用Spring + Hibernate。我所有的HibernateDAO都直接使用sessionFactory。 我有应用程序层->服务层-> DAO层,所有集合都被缓慢加载。 因此,问题在于,有时在应用程序层(包含GUI / swing)中,我会使用服务层方法(包含@Transactional批注)加载实体,并且我想使用此对象的惰性属性,但忽略了会话已经关闭。 解决此问题的最

  • 我正在使用slick.js构建一个旋转木马。但是,即使我将属性从更改为,在我滚动到该图像之前,图像仍然会被加载。我怀疑这是因为我的图像中有标记。我的问题是如何防止浏览器加载响应图像,或者如何正确地延迟加载响应图像。 这是我的img标签的样本

  • 问题内容: 我有一个包含5000多个数据记录的网格。这些数据每天都在增长。当我用网格加载页面时,网格显示数据几乎要花一分钟,我必须一次显示10行。 然后可以使用此jqGrid实现延迟加载吗? 这是我生成JSon字符串的操作: 这是带有jqGrid的页面: 请参阅下面的查询: 我在上述操作中设置的限制金额。该值为10。 问题答案: 好的,所以这是一个基于JPA的部分答案(但是我想让它适应Hibern

  • 描述 (Description) 延迟加载可应用于图像,背景图像和淡入效果,如下所述 - 对于图像 要在图像上使用延迟加载,请按照给定的步骤进行操作 - 使用data-src属性而不是src属性来指定图像源。 将类lazy添加到图像。 <div class = "page-content"> ... <img data-src = "image_path.jpg" class = "l