这是我的实体:
@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]
但我什么都没有:[]
请帮帮我。
看起来您正试图使用带有预定义查询的懒惰加载,我不认为这会起作用。
请参阅,查询中的连接获取
状态如下:
获取所有拥有u.City的用户
所以如果你没有u。City
对于用户来说,返回将为空。
更多关于Join
和Fetch
的信息
你真正想要的是:
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.City
为NULL
,它将返回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;
}
注意:我没有测试代码,这是伪代码,因此您可能需要更改其中一些。
来源
为什么要在这里编写自定义查询。你不需要。
首先,你必须遵循一般惯例:
@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();
}
考虑到您已经在使用自定义查询,最简单的解决方案是左连接获取:@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