Shi*_*ami 3 java repository criteria-api jpa-2.0
我想将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;
}
}
Run Code Online (Sandbox Code Playgroud)
和面积表
@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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我的用户存储库还扩展了JpaSpecificationExecutor
public interface UserRepository extends CrudRepository<User,Long>,JpaSpecificationExecutor<User> {
}
Run Code Online (Sandbox Code Playgroud)
最后我有一个简单的规范
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);
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:我必须在“ ?????”中输入什么?这是表区域的areaName吗?
你可以试试
return cb.equal((Path<String>) ((Path<Area>) root.get("area")).get("areaName"),areaName);
Run Code Online (Sandbox Code Playgroud)
而且您必须确保Area被加载,因为它是惰性的。
编辑:正如我在评论中提到的那样,也许只是尝试不进行任何投射。
对于这种情况,我提供了一种方法,您可以根据需要进行调整:
@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;
}
Run Code Online (Sandbox Code Playgroud)
它以点符号进行调用以获取路径。您的情况是:
getPath(String.class, root, "area.areaName");
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你!
| 归档时间: |
|
| 查看次数: |
2219 次 |
| 最近记录: |