grailsのfindAllタグで「SELECT id, name, part, description FROM user」を使う方法。
私は試した
User.findAll("SELECT id, name, part, description FROM user")
代わりに
User.findAll("FROM user")
しかし、エラーが表示されます。
タグは何ですか?
finadAll()
ドメイン オブジェクトの Collection を返すため、選択する列を列挙しても意味がありません。理解するクエリは実際の SQL ではなく、基本的に WHERE 句のみで構成されています。結果セットを制約したくないように見えるので、おそらくこれで十分です。
User.findAll()
User
すべてのオブジェクトのコレクションを返します。制約が必要な場合、構文は次のとおりです
User.findAll("from User as u where u.id=?", [userId])
または、さらに簡単に、動的ファインダーを使用できます。
User.findAllById(userId);
このようなレポート スタイルのクエリを実行する場合は、executeQuery メソッドを使用します。
def rows = User.executeQuery("SELECT id, name, part, description FROM User")
戻り値は、オブジェクト配列の各要素が列の型である Object[] のリストになります。つまり、1 番目の要素は long、2 番目の要素は String などになります。
Hibernate エンティティを参照しているため、User は大文字にする必要があることに注意してください。これは SQL クエリではなく、HQL です。
オブジェクトの値にアクセスするだけでよいオブジェクトの ArrayList を返します。例えば:
def result = Code.findAll("from Code as c where c.user_code=?",[pass])
result[0].user_code
私のコードクラスは次のようなものです:
class Code {
String user_code
boolean flg_active
static constraints = {
user_code nullable:true, blank:true, size:0..Text.MID
flg_active nullable:true, blank:true, default:1
}
}
特定のフィールドのみを照会する場合は、基準クエリと射影を使用できます。
例:
def userProperties = User.withCriteria {
projections {
property('id')
property('name')
property('part')
property('description')
}
}
このクエリは、ドメイン オブジェクトではなく、一致する行ごとに文字列 (またはデータベースの列の型がマップされているもの) の配列を返します。