diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,11 @@
+## 2.1.4
+
+* Fix getBy with a primary key. #342
+
+## 2.1.3
+
+* Break self-referencing cycles in the entity declarations
+
 ## 2.1.2
 
 * Error with `Double`s without a decimal part [#378](https://github.com/yesodweb/persistent/issues/378)
diff --git a/Database/Persist/Sql/Orphan/PersistQuery.hs b/Database/Persist/Sql/Orphan/PersistQuery.hs
--- a/Database/Persist/Sql/Orphan/PersistQuery.hs
+++ b/Database/Persist/Sql/Orphan/PersistQuery.hs
@@ -14,6 +14,7 @@
 import Database.Persist.Sql.Types
 import Database.Persist.Sql.Raw
 import Database.Persist.Sql.Orphan.PersistStore (withRawQuery)
+import Database.Persist.Sql.Util (dbIdColumns)
 import qualified Data.Text as T
 import Data.Text (Text)
 import Data.Monoid (Monoid (..), (<>))
@@ -86,9 +87,7 @@
         return $ fmap ($= CL.mapM parse) srcRes
       where
         t = entityDef $ dummyFromFilts filts
-        cols conn = case entityPrimary t of 
-                     Just pdef -> T.intercalate "," $ map (connEscapeName conn . fieldDB) $ compositeFields pdef
-                     Nothing   -> connEscapeName conn $ fieldDB (entityId t)
+        cols conn = T.intercalate "," $ dbIdColumns conn t
                       
 
         wher conn = if null filts
diff --git a/Database/Persist/Sql/Orphan/PersistUnique.hs b/Database/Persist/Sql/Orphan/PersistUnique.hs
--- a/Database/Persist/Sql/Orphan/PersistUnique.hs
+++ b/Database/Persist/Sql/Orphan/PersistUnique.hs
@@ -2,10 +2,13 @@
 {-# OPTIONS_GHC -fno-warn-orphans #-}
 module Database.Persist.Sql.Orphan.PersistUnique () where
 
+import Control.Exception (throwIO)
+import Control.Monad.IO.Class (liftIO)
 import Database.Persist
 import Database.Persist.Sql.Types
 import Database.Persist.Sql.Raw
 import Database.Persist.Sql.Orphan.PersistStore (withRawQuery)
+import Database.Persist.Sql.Util (dbColumns, parseEntityValues)
 import qualified Data.Text as T
 import Data.Monoid (mappend)
 import qualified Data.Conduit.List as CL
@@ -30,31 +33,23 @@
 
     getBy uniq = do
         conn <- ask
-        let flds = map (connEscapeName conn . fieldDB) (entityFields t)
-        let cols = case entityPrimary t of
-                     Just _ -> T.intercalate "," flds
-                     Nothing -> T.intercalate "," $ connEscapeName conn (fieldDB (entityId t)) : flds
         let sql = T.concat
                 [ "SELECT "
-                , cols
+                , T.intercalate "," $ dbColumns conn t
                 , " FROM "
                 , connEscapeName conn $ entityDB t
                 , " WHERE "
                 , sqlClause conn
                 ]
-            vals' = persistUniqueToValues uniq
-        withRawQuery sql vals' $ do
+            uvals = persistUniqueToValues uniq
+        withRawQuery sql uvals $ do
             row <- CL.head
             case row of
                 Nothing -> return Nothing
                 Just [] -> error "getBy: empty row"
-                Just (kpv:vals) ->
-                    case fromPersistValues vals of
-                        Left s -> error $ T.unpack s
-                        Right x ->
-                            case keyFromValues [kpv] of
-                                Right k -> return $ Just (Entity k x)
-                                Left _ -> error $ "getBy: keyFromValues failed: " `mappend` show kpv
+                Just vals -> case parseEntityValues t vals of
+                    Left err -> liftIO $ throwIO $ PersistMarshalError err
+                    Right r -> return $ Just r
       where
         sqlClause conn =
             T.intercalate " AND " $ map (go conn) $ toFieldNames' uniq
diff --git a/Database/Persist/Sql/Util.hs b/Database/Persist/Sql/Util.hs
--- a/Database/Persist/Sql/Util.hs
+++ b/Database/Persist/Sql/Util.hs
@@ -5,6 +5,8 @@
   , entityColumnCount
   , isIdField
   , hasCompositeKey
+  , dbIdColumns
+  , dbColumns
 ) where
 
 import Data.Maybe (isJust)
@@ -32,6 +34,19 @@
 hasCompositeKey :: EntityDef -> Bool
 hasCompositeKey = isJust . entityPrimary
 
+dbIdColumns :: SqlBackend -> EntityDef -> [Text]
+dbIdColumns conn t = case entityPrimary t of
+    Just pdef -> map (connEscapeName conn . fieldDB) $ compositeFields pdef
+    Nothing   -> [connEscapeName conn $ fieldDB (entityId t)]
+
+dbColumns :: SqlBackend -> EntityDef -> [Text]
+dbColumns conn t = case entityPrimary t of
+    Just _  -> flds      
+    Nothing -> escapeDB (entityId t) : flds
+  where
+    escapeDB = connEscapeName conn . fieldDB
+    flds = map escapeDB (entityFields t)
+
 parseEntityValues :: PersistEntity record
                   => EntityDef -> [PersistValue] -> Either Text (Entity record)
 parseEntityValues t vals = 
@@ -64,4 +79,3 @@
 
 isIdField :: PersistEntity record => EntityField record typ -> Bool
 isIdField f = fieldHaskell (persistFieldDef f) == HaskellName "Id"
-
diff --git a/persistent.cabal b/persistent.cabal
--- a/persistent.cabal
+++ b/persistent.cabal
@@ -1,5 +1,5 @@
 name:            persistent
-version:         2.1.3
+version:         2.1.4
 license:         MIT
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
