我有一些User类,它与LoginSession类有一对多的关系(我的User类中有LoginSession的集合)。
@Entity(name="T_User")
public class User()
{
....
@OneToMany(fetch=FetchType.LAZY, mappedBy="user", cascade=CascadeType.ALL)
@Fetch(FetchMode.SELECT)
@JsonIgnore
private Set<LoginSession> userLoginSession;
....
}
这是LoginSession类:
@Entity(name="T_LoginSession")
public class LoginSession extends BasicDTO
{
@ManyToOne
@JoinColumn(name="userId")
protected User user;
...
我有这个标准:
Criteria crit = session.createCriteria(User.class);
crit.setFetchMode("loginSession", FetchMode.JOIN);
crit.createAlias("userLoginSession", "session");
crit.add(Restrictions.eq("session.token", sessionToken));
crit.setMaxResults(1);
crit.setFirstResult(0);
crit.setFetchSize(1);
问题在于,获取始终是惰性的。如何使它变得渴望(通过条件而不是通过属性注释)?
注意:
如果我要在@Fetch
上方添加private Set<LoginSession> userLoginSession
批注,则将按批注中的设置获取响应(我不会根据标准setFetchMode
对其进行自定义)。
字段名称(setFetchMode
方法的第一个参数)是否正确?
题:
Is this bug related to my issue?
参考方案
如here所述,您不能同时过滤并渴望获取一个集合。您可以使用相关子查询来解决它:
DetachedCriteria subquery = DetachedCriteria.For(User.class)
.createAlias("userLoginSession", "session")
.add(Restrictions.eq("session.token", sessionToken))
.setFirstResult(0)
.setMaxResults(1) // assuming token is unique otherwise this won't restrict users but loginsessions
.setProjection(Projections.id());
Criteria crit = session.createCriteria(User.class)
.add(Subqueries.propertyIn("id", subquery)
.setFetchMode("userLoginSession", FetchMode.JOIN);
注意:这是我头上的文本编辑器代码。方法名称可能会有所不同
Java-搜索字符串数组中的字符串 - java在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…
HIbernate创建数据库表 - java我正在学习JPA-Hibernate。我正在关注这个article在Dog.java中,它被称为@Table(name = "dog")。 在persistence.xml中,我有以下内容<property name="hibernate.hbm2ddl.auto" value="create"…
Java:线程池如何将线程映射到可运行对象 - java试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …
JAVA:字节码和二进制有什么区别? - javajava字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…
java:继承 - java有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…