0

購入タグの2つのモデルがあります。
購入には多くのタグを含めることができます(1対多の関係)。

1つ以上のタグを持つすべての購入品を返品するための最良の(効率的/クリーンなど)方法は何ですか?(実際のタグエンティティを返す必要はありません)。

現在、購入テーブルの列を使用して、タグが付けられているかどうかを確認していますが、削除したいと考えています(使用されているものについては、PurchaseDAOを参照してください)。

PurchaseController

@RequestMapping(value = "purchases/tagged", method = RequestMethod.GET)
@ResponseBody
public final List<Purchase> getTagged()
{
    return RestPreconditions.checkNotNull(purchaseService.getTagged());
}

@RequestMapping(value = "purchases/pending", method = RequestMethod.GET)
@ResponseBody
public final List<Purchase> getPending()
{
    return RestPreconditions.checkNotNull(purchaseService.getPending());
}


PurchaseService

@Service
public class PurchaseService implements IPurchaseService
{
    @Autowired
    private IPurchaseDAO purchaseDAO;

    public PurchaseService()
    {

    }

    @Transactional
    public List<Purchase> getAll()
    {
        return purchaseDAO.findAll();
    }

    @Transactional
    public List<Purchase> getPending()
    {
        return purchaseDAO.getPending();
    }

    @Transactional
    public List<Purchase> getTagged()
    {
        return purchaseDAO.getTagged();
    }
}


PurchaseDAO

@Repository
public class PurchaseDAO extends AbstractJpaDAO<Purchase> implements IPurchaseDAO {

    @PersistenceContext
    EntityManager entityManager;

    public PurchaseDAO() {
        setClazz(Purchase.class);
    }

    public  List<Purchase> getPending() {
        return entityManager.createQuery("from Purchase where tagged = 0")
                .getResultList();
    }

    public  List<Purchase> getTagged() {
        return entityManager.createQuery("from Purchase where tagged = 1")
                .getResultList();
    }
}


私の購入DAOとタグDAOはどちらも、次のAbstractJpaDAOを拡張します。

public abstract class AbstractJpaDAO<T extends Serializable> implements
        IAbstractJpaDAO<T> {

    private Class<T> clazz;

    @PersistenceContext
    EntityManager entityManager;

    public void setClazz(final Class<T> clazzToSet) {
        this.clazz = clazzToSet;
    }

    public T findOne(final Long id) {
        return entityManager.find(clazz, id);
    }

    public List<T> findAll() {
        return entityManager.createQuery("from " + clazz.getName())
                .getResultList();
    }

    public void save(final T entity) {
        entityManager.persist(entity);
    }
}

ありがとう

JB提案の更新

PurchaseDAO getTagged()を次のように変更した後:

public  List<Purchase> getTagged() {
        return entityManager.createQuery("SELECT p FROM Puchase p INNER JOIN p.tags")
                .getResultList();
    }

次のエラーが発生します:

TRACE [http-bio-8080-exec-3] o.s.w.c.s.AnnotationConfigWebApplicationContext [AbstractApplicationContext.java:322] Publishing event in Root WebApplicationContext: ServletRequestHandledEvent: url=[/PurchaseAPIServer/api/purchases/tagged]; client=[192.168.1.17]; method=[GET]; servlet=[PurchaseAPIServer]; session=[null]; user=[null]; time=[411ms]; status=[failed: org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.ast.QuerySyntaxException: Puchase is not mapped [SELECT p FROM Puchase p JOIN p.tags tag]; nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: Puchase is not mapped [SELECT p FROM Puchase p JOIN p.tags tag]]
4

1 に答える 1

1
select p from Purchase p inner join p.tags

内部結合により、購入用のタグが少なくとも1つ存在するようになります。

于 2012-06-03T15:17:54.003 に答える