문제

HQL에서 고유 한 쿼리를 만들 수있는 방법이 있습니까? "고유 한"키워드 또는 다른 방법을 사용하여. Contrict가 HQL의 유효한 키워드인지 확실하지 않지만 SQL 키워드 "Contrest"와 동등한 HQL을 찾고 있습니다.

도움이 되었습니까?

해결책

다음은 우리가 사용하는 HQL의 스 니펫입니다. (신분을 보호하기 위해 이름이 변경되었습니다)

String queryString = "select distinct f from Foo f inner join foo.bars as b" +
                " where f.creationDate >= ? and f.creationDate < ? and b.bar = ?";
        return getHibernateTemplate().find(queryString, new Object[] {startDate, endDate, bar});

다른 팁

그것은 주목할 가치가 있습니다 distinct HQL의 키워드는 직접 매핑되지 않습니다 distinct SQL의 키워드.

당신이 사용하는 경우 distinct HQL의 키워드, 때때로 최대 절전 모드는 다음을 사용합니다. distinct SQL 키워드이지만 일부 상황에서는 결과 변압기를 사용하여 뚜렷한 결과를 생성합니다. 예를 들어 다음과 같은 외부 조인을 사용할 때 다음과 같습니다.

select distinct o from Order o left join fetch o.lineItems

이 경우 SQL 레벨에서 복제를 걸러내는 것은 불가능하므로 최대 절전 모드는 ResultTransformer Duplicates를 필터합니다 ~ 후에 SQL 쿼리가 수행되었습니다.

다음에 이런 식으로하십시오

 Criteria crit = (Criteria) session.
                  createCriteria(SomeClass.class).
                  setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

 List claz = crit.list();

당신은 또한 사용할 수 있습니다 Criteria.DISTINCT_ROOT_ENTITY 최대 절전 모드 HQL 쿼리도 있습니다.

예시:

Query query = getSession().createQuery("from java_pojo_name");
query.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
return query.list();

HQL 쿼리와 결합 된 결과 변압기에 문제가있었습니다. 내가 시도했을 때

final ResultTransformer trans = new DistinctRootEntityResultTransformer();
qry.setResultTransformer(trans);

작동하지 않았습니다. 나는 이것처럼 수동으로 변환해야했다 :

final List found = trans.transformList(qry.list());

기준으로 API 변압기는 잘 작동했습니다.

내 메인 쿼리는 모델에서 다음과 같습니다.

@NamedQuery(name = "getAllCentralFinancialAgencyAccountCd", 
    query = "select distinct i from CentralFinancialAgencyAccountCd i")

그리고 나는 여전히 내가 "뚜렷한"결과를 고려한 것을 얻지 못했습니다. 그들은 테이블의 주요 키 조합을 기반으로 구별되었습니다.

그래서 DaoImpl 나는 한 줄의 변화를 추가하고 결국 내가 원하는 "고유 한"반환을 얻었습니다. 예는 00을 네 번 보지 않고 이제 한 번만 보는 것입니다. 다음은 내가 추가 한 코드입니다 DaoImpl:

@SuppressWarnings("unchecked")
public List<CacheModelBase> getAllCodes() {

    Session session = (Session) entityManager.getDelegate();
    org.hibernate.Query q = session.getNamedQuery("getAllCentralFinancialAgencyAccountCd");
    q.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); // This is the one line I had to add to make it do a more distinct query.
    List<CacheModelBase> codes;
    codes = q.list();
    return codes;       
}

도움이 되었기를 바랍니다! 다시 한 번, 서비스, DAO 및 모델 유형의 프로젝트를 구현하는 코딩 관행을 따르는 경우에만 효과가있을 수 있습니다.

고객 엔티티가 고객 _information 테이블에 매핑되어 있고 고객의 고유 한 이름 목록을 받고 싶다고 가정 해 봅시다. 아래 스 니펫을 사용하여 동일하게 얻을 수 있습니다.

Query distinctFirstName = session.createQuery("select ci.firstName from Customer ci group by ci.firstName");
Object [] firstNamesRows = distinctFirstName.list();

도움이되기를 바랍니다. 따라서 여기서는 고유 한 키워드를 사용하는 대신 그룹을 사용하고 있습니다.

또한 이전에 여러 열에 적용하려면 고유 한 키워드를 사용하기가 어렵다는 것을 알았습니다. 예를 들어, 나는 고유 한 FirstName의 목록을 얻고 싶습니다. LastName은 단순히 작동합니다. 이 경우 뚜렷한 사용에 어려움이있었습니다.

이와 같은 기준 빌더의 고유 한 키워드를 할 수 있습니다.

CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Orders> query = builder.createQuery(Orders.class);
Root<Orders> root = query.from(Orders.class);
query.distinct(true).multiselect(root.get("cust_email").as(String.class));

모델 클래스에서 필드 생성자를 만듭니다.

Equernate Query Language에 대한 대답이 고유 한 필드를 사용했습니다. flight_route *에서 *선택 (To_city)을 선택할 수 있습니다. 사용하는 경우 SQL 쿼리, 문자열 목록을 반환합니다. 엔티티 클래스별로 반환 값을 사용할 수 없습니다. 따라서 이러한 유형의 문제를 해결하기위한 답은 사용입니다. HQL ~와 함께 SQL.

FROM FLIGHT_ROUTE F WHERE F.ROUTE_ID IN (SELECT SF.ROUTE_ID FROM FLIGHT_ROUTE SF GROUP BY SF.TO_CITY);

에서 SQL query 문은 고유 한 route_id와 입력을 목록으로 얻었습니다. 쿼리 필터에서 in (list)에서 뚜렷한 to_city가 있습니다.

리턴 유형은 엔티티 콩 유형입니다. 따라서 Ajax에서는 할 수 있습니다 자동 상정.

모두 괜찮을 수 있습니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top