5

プロジェクトに問題があります。ユーザーテーブルからユーザーを検索する検索関数を作成しようとしていますが、その間に、別のアバターテーブルからユーザーのアバターの対応する「 url 」も取得したいと思います。これら2つのテーブル間にハードマッピングを作成したいと思います。Hibernate Criteriaを使用して柔軟にそれを行うにはどうすればよいですか?どちらのテーブルも「loginID」の主キーを使用しています。

私には2つのクラスがあります:

public class User{
    private String loginID;
    private String screenname;
    ......
}
public class Avatar{
    private Integer id;
    private String loginID;
    private String url;
    .......
}

私が書いたこと:

  public List<Users> searchLogin(String keywords, int startFrom) {
        List<Users> userList = new ArrayList<Users>();
        try {
            Session session = HibernateUtil.beginTransaction();
            Criteria criteria = session.createCriteria(Users.class,"users");
            criteria.add(Restrictions.ilike("loginID", keywords, MatchMode.ANYWHERE));
            userList = criteria.list();
            if (session.isOpen()) {
                session.close();
            }
            return userList;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

みんなありがとう!!

4

3 に答える 3

8

遅いですが、実際にグーグルしてここにたどり着く他の人にとっては便利かもしれません。HQLをマッピングまたは使用する必要はありません。

方法は次のとおりです。

    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<Tuple> criteria = builder.createTupleQuery();
    Root<EntityA> entityARoot= criteria.from(EntityA.class);
    Root<EntityB> entityBRoot = criteria.from(EntityB.class);

    //Predicates
    List<Predicate> predicates = new ArrayList<>();
    //Add the predicates you need

    //And predicates
    List<Predicate> andPredicates = new ArrayList<>();
    andPredicates.add(builder.equal(entityARoot.get("id"), entityBRoot.get("id")));
    andPredicates.add(builder.and(predicates.toArray(new Predicate[0])));

    criteria.multiselect(entityARoot, entityBRoot);
    criteria.where(andPredicates.toArray(new Predicate[0]));

    TypedQuery<Tuple> query = em.createQuery(criteria);

    List<Tuple> result = query.getResultList();
于 2013-11-12T14:23:49.513 に答える
3

HQLを使用する

from User u,Avatar a where where u.loginID = a.loginID and u.loginID = :loginID

これにより、[User、Avatar]配列のリストが返されます。

于 2012-09-06T04:00:35.000 に答える
2

どちらのテーブルも「loginID」の主キーを使用しています。

これは正しいです?Avatar'id'という名前のフィールドを持つクラスが表示されますが、これはid /主キーではありませんか?

また、フィールドの使用について言及しAvatarていることに気づきました。エンティティをリンクする正しい方法は、クラスによるものです。注釈を使用すると、次のようになります。UserloginId

@Entity
public class User
{
    @Id
    private String loginId;
    private String screenName;
    @OneToOne(mappedBy = "user")
    private Avatar avatar;
}

@Entity
public class Avatar
{
    @Id
    private Integer id;
    @OneToOne
    private User user;
    private String url;
}

次に、をフェッチしたい場合は、に属するUserURLをフェッチするのが最善です。これは、結合を使用してからのURLにアクセスするため、からキャストする必要がなく、型の安全性を維持できます。AvatarUserUserAvatarAvatarObjectUserAvatar

User user = fetchUserJoinAvatar("123");
String url = user.getAvatar().getUrl();

public User fetchUserJoinAvatar(String loginId)
{
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<User> query = cb.createQuery(User.class);

    Root<User> user = query.from(User.class);
    user.fetch("avatar");
    query.select(user).where(cb.equal(user.get("loginId"), loginId));
    return em.createQuery(query).getSingleResult();
}
于 2012-09-07T12:57:50.130 に答える