使用以下代码我可以成功检索用户的地址字段,为此我需要使用Projection定义其所有字段。想象地址有100个字段,在这种情况下我必须定义所有字段。
我想知道我是否可以返回客户的地址对象而不在Proposition中定义其所有字段?
我知道我可以检索地址的id并使用它来检索它的对象,但我想知道是否有其他方法而不是这个或定义其所有字段。
休眠
.....
Criteria cre = session.createCriteria(User.class, "user")
.createAlias("user.address", "addr");
cre.add(Restrictions.eq("user.id", ID));
ProjectionList pl = Projections.projectionList();
pl.add(Projections.property("addr.id").as("id"));
pl.add(Projections.property("addr.unit").as("unit"));
.......
cre.setProjection(pl);
Address address = (Address) cre.list().get(0);
我也使用了以下内容但它遇到了错误(无法解析属性:addr of:com.myProject.User)
pl.add(Projections.property("addr").as("address"));
爪哇
@Entity
public Class User {
@Id
@GeneratedValue
private long id;
@OneToOne
private Address address;
...
}
答案 0 :(得分:4)
使用JPQL / HQL:
select a from User u join u.address a where u.id = :userId
Criteria API比JPQL更受限制,并且不能选择除根实体之外的任何其他实体。如果查询不必动态组合,则不应使用它。当然,如果关联是双向的,你可以简单地使用
select a from Address a where a.user.id = :userId
或其等效标准:
Criteria c = session.createCriteria(Address.class, "a");
c.createAlias("a.user", "u");
c.add(Restrictions.eq("u.id", userId));
答案 1 :(得分:1)
如果从查询中提取的结果将与您定义的DAO的字段匹配。我只是从hql或本机SQL查询中输入结果。
Select *
From Address a
where a.id = :userid
地址addrObject =(地址)query.uniqueResult();
答案 2 :(得分:1)
这样做
Criteria criteria = session.createCriteria(User.class, "user")
.createAlias("user.address", "addr")
.add(Restrictions.eq("user.id", userId))
.setProjection(Projections.property("addr"));
Address address = (Address) criteria.list().get(0);
答案 3 :(得分:1)
几个选项:
例如, 在mysql中
SHOW COLUMNS FROM Address
在postgres中
SELECT * FROM information_schema.columns
WHERE table_schema = your_schema
AND table_name = your_table
我希望这会有所帮助。