1

私はJPAが初めてで、いくつかのサンプルプロジェクトを始めようとしています。GraniteDS サンプル プロジェクト ("Hello, World" アプリ) を試したところ、helloJava Bean を更新または挿入するメソッドが見つかりました。私にはなんとなく悪いように見えますが、一方で、どのように見栄えが良いかわかりません。

UPDATEエンティティを含む 結果が存在しないことを知るために、クエリが例外をスローする必要があるのは好きではありませんWelcome。エレガントな方法でレコードがあるかどうかを確認する方法はありますか?

    package info.alekna.project.services;

import java.util.List;
import java.util.Date;
import java.text.SimpleDateFormat;

import javax.persistence.Query;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.NoResultException;

import org.granite.tide.data.DataEnabled;
import org.granite.tide.data.DataEnabled.PublishMode;


import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import info.alekna.project.entities.Welcome;


@Service
@DataEnabled(topic="welcomeTopic", publish=PublishMode.ON_SUCCESS)
public class WelcomeServiceImpl implements WelcomeService {

    @PersistenceContext
    private EntityManager entityManager;


    @Transactional
    public Welcome hello(String name) {
        if (name == null || name.trim().length() == 0)
            throw new RuntimeException("Name cannot be null or empty");

        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        Welcome welcome = null;
        try {
            Query q = entityManager.createQuery("select w from Welcome w where w.name = :name");
            q.setParameter("name", name);
            welcome = (Welcome)q.getSingleResult();
            welcome.setMessage("Welcome " + name + " (" + sdf.format(new Date()) + ")");
        }
        catch (NoResultException e) {
            welcome = new Welcome();
            welcome.setName(name);
            welcome.setMessage("Welcome " + name + " (" + sdf.format(new Date()) + ")");
            entityManager.persist(welcome);
        }
        return welcome;
    }


    @Transactional(readOnly=true)
    public List<Welcome> findAll() {
        return entityManager.createQuery("select w from Welcome w order by w.name", Welcome.class).getResultList();
    }
}
4

2 に答える 2

1

を呼び出しgetResultList()Query、結果Listsize()が正確に 1 かどうかを確認できます。

ただし、クエリが 1 つの結果のみを返さなければならないことが絶対に確実な場合は、両方を呼び出しgetSingleResult()てキャッチするのが理にかなっています。これらの例外のいずれかが発生した場合は、結果が 1 つだけ返されるという仮定が間違っていたためです。エラーとして処理する必要があります。NoResultExceptionNonUniqueResultException

于 2012-12-09T21:33:23.217 に答える
1

q.getResultList()(コメントで質問に答える)リストのサイズをいつでも使用して確認できます。これを行う際の問題は、テーブルで完全な実行が発生することであり、これが必要ない場合は避ける必要があります。

NoResultExceptionそれは例外的な状態であるため、明示的に呼び出すとスローするのは一種の論理的getSingleResultです:-)

于 2012-12-09T21:35:19.330 に答える