1

そのため、私はこれについて不足し続けており、正しく機能させることができないようです。

HibernateUtil.get(clazz, pkId)メソッドを使用すると問題なく動作するように見えますが、 HibernateUtil.pagedQuery(clazz, criteria , start, stop)を使用しようとすると、複数の同一のオブジェクトが返されます。

たとえば、ロール 1 に割り当てられた 3 人の従業員がいる場合、実行中...

Role role = HibernateUtil.get(Role.class, new Integer(1));

...期待どおりに動作します。でも、走ったら…

List<Criterion> c = new ArrayList();
c.add(Restrictions.eq("roleTypeSeqNo", new Integer(1)));
List<Role> roles = (List<Role>) phi.util.hibernate.HibernateUtil.pagedQuery(Role.class, c, 0, 50);

... 3 つの同一のロールのリストを返します。これらはすべて役割 1 を表します。

誰かが私を正しい道に導くことができれば、本当に感謝しています。

前もって感謝します!

これが私のクラスの短縮版です

@Entity
@Table(name="ASSIGNMENTS")
public class Assignment implements Serializable {
  @EmbeddedId
  private AssignmentPK pk;
  // After coming across many errors I finally caved and reverted roleTypeSeqNo back to just an Integer.
  private Integer roleTypeSeqNo;
  private String status;
  private String location;
}

@Embeddable
public class AssignmentPK implements Serializable {
  @ManyToOne
  @JoinColumn(name="EMPLID")
  private Employee employee;
  @Column(name="PRIORITY_NO")
  private String priorityNo;
}

@Entity
public class Employee implements Serializable {
  @Id
  private Integer emplId;
  private String name;
}

@Entity
public class Role implements Serializable {
  @Id
  private Integer roleTypeSeqNo;
  private Integer reportsToRole;
  @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="roleTypeSeqNo")
  @JoinTable(
      name="ASSIGNMENTS"
      , joinColumns={@JoinColumn(name="ROLE_TYPE_SEQ_NO")}
      , inverseJoinColumns={
          @JoinColumn(name="EMPLID"),
          @JoinColumn(name="PRIORITY_NO")
      }
  )
  private List<Assignment> assignments;
}

public class HibernateUtil {
    public static Object get(Class clazz, Serializable pkId) {
        Session session = getSession();
        Transaction transaction = session.beginTransaction();

        Object obj = session.get(clazz, pkId);

        transaction.commit();
        session.close();

        return obj;
    }

    public static List pagedQuery(Class clazz, List<Criterion> criterion, Integer start, Integer size){
        Session session = getSession();
        try {
            Transaction transaction = session.beginTransaction();

            DetachedCriteria dCriteria = DetachedCriteria.forClass(clazz);
            for(Criterion c : criterion){
                dCriteria.add(c);
            }
            dCriteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
            dCriteria.setProjection(Projections.id());

            Criteria criteria=session.createCriteria(clazz);
            criteria.add(Subqueries.propertyIn("id", dCriteria));
            criteria.setFirstResult(start);
            criteria.setMaxResults(size);

            List records = criteria.list();

            transaction.commit();

            return records;
        } catch (Exception e) {
            Logger.getLogger("HibernateUtil").log(Level.SEVERE, "There was an EXCEPTION THROWN!!!", e);
            return null;
        } finally  {
            session.close();
        }
    }
}
4

1 に答える 1

5
dCriteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);

主な基準にある必要があります

criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);

また、サブクエリも必要ありません。以下で十分です

    Criteria criteria = session.createCriteria(clazz);

    for(Criterion c : criterions){
        criteria.add(c);
    }

    criteria.setFirstResult(start);
    criteria.setMaxResults(size);

    List records = criteria.list();
于 2012-04-26T09:50:30.803 に答える