문제

나는 건축업자를 찾고 있어요 HQL 자바에서.나는 다음과 같은 것들을 제거하고 싶습니다 :

StringBuilder builder = new StringBuilder()
    .append("select stock from ")
    .append( Stock.class.getName() )
    .append( " as stock where stock.id = ")
    .append( id );

나는 다음과 같은 것을 갖고 싶습니다.

HqlBuilder builder = new HqlBuilder()
    .select( "stock" )
    .from( Stock.class.getName() ).as( "stock" )
    .where( "stock.id" ).equals( id );

좀 구글링했는데 못찾았네요.

나는 빠르고 멍청한 글을 썼다 HqlBuilder 지금은 내 요구에 적합하지만 나보다 더 많은 사용자와 테스트가 있는 것을 찾고 싶습니다.

메모:저는 Criteria API로는 실패했지만 이와 같은 작업을 수행하고 싶습니다.

select stock
from com.something.Stock as stock, com.something.Bonus as bonus
where stock.someValue = bonus.id

즉.속성이 있는 모든 주식을 선택하세요. someValue ~를 가리키다 어느 보너스 테이블의 보너스.

감사해요!

도움이 되었습니까?

해결책

@세바스티앙 로카-세라
이제 우리는 구체적인 단계에 이르렀습니다.수행하려는 조인 유형은 실제로 Criteria API를 통해 가능하지 않지만 하위 쿼리는 동일한 작업을 수행해야 합니다.먼저 DetachedCriteria 보너스 테이블의 경우 IN 연산자 someValue.

DetachedCriteria bonuses = DetachedCriteria.forClass(Bonus.class);
List stocks = session.createCriteria(Stock.class)
    .add(Property.forName("someValue").in(bonuses)).list();

이는 다음과 같습니다.

select stock
from com.something.Stock as stock
where stock.someValue in (select bonus.id from com.something.Bonus as bonus)

유일한 단점은 다른 테이블에 대한 참조가 있는 경우입니다. someValue 귀하의 ID는 모든 테이블에서 고유하지 않습니다.그러나 귀하의 쿼리에는 동일한 결함이 있습니다.

다른 팁

그렇지 않습니까? 기준 API 당신을 위해 그것을합니까?문의하신 내용과 거의 똑같아 보입니다.

문제에 대한 유형 안전 접근 방식을 얻으려면 다음을 고려하십시오. 쿼리dsl.

예제 쿼리는 다음과 같습니다.

HQLQuery query = new HibernateQuery(session);
List<Stock> s = query.from(stock, bonus)
  .where(stock.someValue.eq(bonus.id))
  .list(stock);

Querydsl은 JPA2와 같은 코드 생성을 위해 APT를 사용하고 JPA/Hibernate, JDO, SQL 및 Java 컬렉션을 지원합니다.

저는 Querydsl의 관리자이므로 이 답변은 편향되어 있습니다.

다른 유형이 안전한 쿼리 dsl의 경우 다음을 권장합니다. http://www.torpedoquery.org.라이브러리는 아직 젊지만 엔터티의 클래스를 직접 사용하여 유형 안전성을 제공합니다.이는 리팩터링 또는 재설계 전에 쿼리가 더 이상 적용되지 않는 경우 초기 컴파일러 오류를 의미합니다.

나는 또한 당신에게 예를 들었습니다.귀하의 게시물에서 하위 쿼리 제한을 수행하려고 하는 것으로 생각되므로 이에 대한 예를 작성했습니다.

import static org.torpedoquery.jpa.Torpedo.*;

Bonus bonus = from(Bonus.class);
Query subQuery = select(bonus.getId());

Stock stock = from(Stock.class);
where(stock.getSomeValue()).in(subQuery);

List<Stock> stocks = select(stock).list(entityManager);

당신은 Hibernate에 내장된 Criteria 쿼리 API를 사용하고 싶어하는 것 같습니다.위의 쿼리를 수행하려면 다음과 같이 표시됩니다.

List<Stock> stocks = session.createCriteria(Stock.class)
    .add(Property.forName("id").eq(id))
    .list();

아직 Hibernate 세션에 접근할 수 없다면, 다음과 같이 'DetachedCriteria'를 사용할 수 있습니다:

DetachedCriteria criteria = DetachedCriteria.forClass(Stock.class) 
    .add(Property.forName("id").eq(id));

특정 ID의 보너스가 있는 모든 주식을 얻으려면 다음을 수행할 수 있습니다.

DetachedCriteria criteria = DetachedCriteria.forClass(Stock.class)
     .createCriteria("Stock")
          .add(Property.forName("id").eq(id)));

더 많은 정보를 확인하려면 기준 쿼리 최대 절전 모드 문서에서

@세바스티앙 로카-세라

select stock
from com.something.Stock as stock, com.something.Bonus as bonus
where stock.bonus.id = bonus.id

그것은 단지 조인일 뿐입니다.Hibernate는 당신이 사이의 매핑을 가지고 있는 경우에만 그것을 자동으로 수행합니다. Stock 그리고 Bonus 설정 및 경우 bonus 의 재산이다 Stock. Criteria.list() 돌아올 것이다 Stock 객체와 당신은 단지 전화 stock.getBonus().

참고로, 다음과 같은 작업을 하고 싶다면

select stock
from com.something.Stock as stock
where stock.bonus.value > 1000000

당신은 사용해야합니다 Criteria.createAlias().그것은 다음과 같을 것입니다

session.createCriteria(Stock.class).createAlias("bonus", "b")
   .add(Restrictions.gt("b.value", 1000000)).list()

Criteria API는 HQL에서 사용 가능한 모든 기능을 제공하지 않습니다.예를 들어 동일한 열에 대해 둘 이상의 조인을 수행할 수 없습니다.

왜 사용하지 않습니까? 명명된 쿼리?훨씬 더 깨끗해 보입니다.

Person person = session.getNamedQuery("Person.findByName")
                             .setString(0, "Marcio")
                             .list();

나는 귀하의 상황에 맞게 쉽게 구축할 수 있는 OMERO용 GPL 솔루션을 작성했습니다.

용법:

QueryBuilder qb = new QueryBuilder();
qb.select("img");
qb.from("Image", "img");
qb.join("img.pixels", "pix", true, false);

// Can't join anymore after this
qb.where(); // First
qb.append("(");
qb.and("pt.details.creationTime > :time");
qb.param("time", new Date());
qb.append(")");
qb.and("img.id in (:ids)");
qb.paramList("ids", new HashSet());
qb.order("img.id", true);
qb.order("this.details.creationEvent.time", false);

상태 머신 "select->from->join->where->order" 등으로 작동합니다.선택적 매개변수를 유지합니다.Criteria API가 수행할 수 없는 쿼리가 여러 개 있습니다(참조: HHH-879), 따라서 결국 이 작은 클래스를 작성하여 StringBuilder를 래핑하는 것이 더 간단했습니다.(메모:티켓이 있어요 HHH-2407 두 가지를 통합해야 하는 Hibernate 분기를 설명합니다.그 후에는 Criteria API를 다시 방문하는 것이 합리적일 것입니다.)

다음에서 제공되는 검색 패키지를 살펴보세요. 최대 절전 모드-일반-다오 프로젝트.이것은 꽤 괜찮은 HQL Builder 구현입니다.

이 스레드는 꽤 오래되었지만 HqlBuilder도 찾고 있었는데 이것을 발견했습니다. "화면 보호기" 프로젝트
Windows Screensaver가 아닙니다. "소분자 및 RNAi 스크리닝을 수행하는 고처리량 스크리닝(HTS) 시설을 위한 실험실 정보 관리 시스템(LIMS)입니다."

여기에는 꽤 괜찮아 보이는 HQLBuilder가 포함되어 있습니다.
다음은 사용 가능한 방법의 샘플 목록입니다.

...
HqlBuilder select(String alias);
HqlBuilder select(String alias, String property);
HqlBuilder from(Class<?> entityClass, String alias);
HqlBuilder fromFetch(String joinAlias, String joinRelationship, String alias);
HqlBuilder where(String alias, String property, Operator operator, Object value);
HqlBuilder where(String alias, Operator operator, Object value);
HqlBuilder where(String alias1, Operator operator, String alias2);
HqlBuilder whereIn(String alias, String property, Set<?> values);
HqlBuilder whereIn(String alias, Set<?> values);
HqlBuilder where(Clause clause);
HqlBuilder orderBy(String alias, String property);
HqlBuilder orderBy(String alias, SortDirection sortDirection);
HqlBuilder orderBy(String alias, String property, SortDirection sortDirection);
String toHql();
...

이제 표준도 사용할 수 있습니다. JPA 유형 안전 쿼리는 덜 표준이지만 좋습니다. 개체 쿼리

예:

JPA 유형 안전

EntityManager em = ...
CriteriaBuilder qb = em.getCriteriaBuilder();
CriteriaQuery<Stock> c = qb.createQuery(Stock.class);
Root<Stock> = c.from(Stock.class);
Predicate condition = qb.eq(p.get(Stock_.id), id);
c.where(condition);
TypedQuery<Stock> q = em.createQuery(c); 
List<Stock> result = q.getResultList();

개체 쿼리

EntityManager em = ...
ObjectQuery<Stock> query = new GenericObjectQuery<Stock>(Stock.class);
Stock toSearch = query.target();
query.eq(toSearch.getId(),id);
List<Stock> res = (List<Stock>)JPAObjectQuery.execute(query, em);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top