4

jpaリポジトリを仕様で使いたい

今、私は2つのテーブルを持っています

@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ですか?

4

1 に答える 1

7

あなたは試すことができます

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");

それが役に立てば幸い!

于 2012-11-06T08:21:07.807 に答える