Java 无法显示模板中关系的数据
我一直在尝试在Twirl模板中显示一对一关系的数据(使用Play Framework Java-2.5.10)。基本上我有一个用户模型:Java 无法显示模板中关系的数据,java,playframework,twirl,Java,Playframework,Twirl,我一直在尝试在Twirl模板中显示一对一关系的数据(使用Play Framework Java-2.5.10)。基本上我有一个用户模型: package models; import java.sql.Date; import javax.persistence.*; import com.avaje.ebean.Model; @Entity @Table(name = "users") public class User extends Model { @Id @Colum
package models;
import java.sql.Date;
import javax.persistence.*;
import com.avaje.ebean.Model;
@Entity
@Table(name = "users")
public class User extends Model {
@Id
@Column(name = "id")
public Long id;
@Column(name = "first_name")
public String firstName;
@Column(name = "middle_name")
public String middleName;
@Column(name = "last_name")
public String lastName;
@Column(name = "date_of_birth")
public Date dateOfBirth;
@Column(name = "sex")
public String sex;
@OneToOne
@JoinColumn(name = "time_zone_id")
public TimeZone timeZone;
public static Finder<Long, User> find = new Finder<>(User.class);
}
现在,这为我获得了正确的农民数据,但是当我试图通过用户模型显示名称时,我得到了null。更具体地说,编写此代码会导致空值(实际上,我得到的是nullnull
):
@(farmer.user.firstName+farmer.user.lastName)
我遗漏了什么?正如评论中所讨论的,这是因为play enhancer根本不适用于视图或任何Scala代码。由于Twirl将
scala.html
code编译为scala代码,因此增强器不会触及此编译代码
然后,解决方案是手动为关系创建get:
public class Farmer extends Model {
public User getUser() {
return this.user;
}
}
这是Java代码,然后将按预期进行处理。当然,您必须更改视图以使用farmer.getUser
而不是farm.user
此外,正如文档中所述,字节码增强涉及到一些魔术。但是您可以完全避免它,只使用常规POJO(使用显式声明的GET和sets)。您使用的是什么?如果我没记错的话,模型增强器不适用于视图。因此,在您的
Farmer
模型中,您必须创建一个getUser
方法,然后调整视图以使用它。@marcospereira-Hmm,谢谢。我确实在使用增强器插件。而我可以通过将示例更改为return Farmer.find.fetch(“用户”).where().eq(“status”,status.ACTIVE.name()).findList(),使其发挥作用代码>我不认为我可以继续这样做来穿越长长的关系链。但是,我没有从视图调用函数,我希望它能像@farmer.getUser().firstName()一样简单。
@marcospereira谢谢,这很有效!你能在下面加上这个作为答案,这样我就可以接受了吗?:-)(顺便说一句,我讨厌这个增强插件——它在文档中被吹捧为魔术,但就像魔术一样,它不起作用)。
public class FarmerController extends Controller {
public Result all() {
return ok(farmers.render(Farmer.getAllActive()));
}
public Result farmer(Long id, String url) {
return ok(farmer.render());
}
}
<div><h4>@(farmer.user.firstName + farmer.user.lastName)</h4></div>
public class Farmer extends Model {
public User getUser() {
return this.user;
}
}