gpt4 book ai didi

java - 具有@OneToOne 关系的jpa 规范

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:52:05 26 4
gpt4 key购买 nike

我想使用符合规范的 jpa 存储库

现在我有两个表

@Entity
@Table(name="user")
public class User implements Serializable {

private static final long serialVersionUID = 1L;

private Long idUser;

private Area area;

@Id @GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="iduser")
public Long getIdUser() {
return idUser;
}
public void setIdUser(Long idUser) {
this.idUser = idUser;
}

@OneToOne(fetch=FetchType.LAZY)
@JoinColumn(name="idarea")
public Area getArea() {
return area;
}

public void setArea(Area area) {
this.area = area;
}

}

和面积表

@Entity
@Table(name = "area")
public class Area {

@Id @GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="idarea")
private Long idArea;

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

public Long getIdArea() {
return idArea;
}

public void setIdArea(Long idArea) {
this.idArea = idArea;
}

public String getAreaName() {
return areaName;
}

public void setAreaName(String areaName) {
this.areaName = areaName;
}

}

然后我有用户存储库也扩展了 JpaSpecificationExecutor

public interface UserRepository extends   CrudRepository<User,Long>,JpaSpecificationExecutor<User> {
}

最后我有一个简单的规范

public class UserSpecification {

public static Specification<User> findByAreaName(final String areaName){
return new Specification<User>() {

@Override
public Predicate toPredicate(Root<User> root,
CriteriaQuery<?> criteria, CriteriaBuilder cb) {
return cb.equal(root.<String>get("??????"),areaName);
}
};

}

}

所以,我的问题是:我必须在“??????”中输入什么?那就是表区的areaName?

最佳答案

你可以试试

return cb.equal((Path<String>) ((Path<Area>) root.get("area")).get("areaName"),areaName);

而且您必须确保该区域已加载,因为它很懒。

编辑:正如我在评论中提到的那样,也许只是尝试完全不转换。

对于这种情况,我有一种方法可以根据您的需要进行调整:

@SuppressWarnings("unchecked")
private <T, R> Path<R> getPath(Class<R> resultType, Path<T> root, String path) {
String[] pathElements = path.split("\\.");
Path<?> retVal = root;
for (String pathEl : pathElements) {
retVal = (Path<R>) retVal.get(pathEl);
}
return (Path<R>) retVal;
}

它用点符号调用以获取路径。在您的情况下,它将是:

getPath(String.class, root, "area.areaName");

希望对您有所帮助!

关于java - 具有@OneToOne 关系的jpa 规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13246959/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com